Python数据库操作实战第5篇

小飞兽 Python 4 次阅读 2026-07-24

Python数据库操作实战第5篇。本文全面讲解Python操作MySQL、SQLite、PostgreSQL等主流数据库的核心技能,包括连接管理、CRUD操作、事务处理、ORM使用等完整流程。Introduction:数据库是几乎所有应用系统的核心存储组件,Python通过DB-API 2.0规范提供统一的数据库编程接口。不同的数据库有对应的驱动:PyMySQL用于MySQL、sqlite3是Python内置的SQLite库、psycopg2用于PostgreSQL。掌握这些基础技能后,学习SQLAlchemy等ORM框架会事半功倍。本文涵盖数据库连接、增删改查、预处理语句防SQL注入、事务控制、连接池、ORM入门等核心知识点。

Python数据库基础和DB-API:Python数据库操作遵循DB-API 2.0规范,所有数据库驱动都提供相同的接口。import sqlite3 conn = sqlite3.connect('test.db') cursor = conn.cursor() cursor.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)') cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('张三', 25)) conn.commit() result = cursor.execute('SELECT * FROM users').fetchall() print(result) conn.close()

MySQL数据库操作PyMySQL:import pymysql conn = pymysql.connect(host='localhost', user='root', password='password', database='test', charset='utf8mb4') cursor = conn.cursor() cursor.execute('SELECT * FROM users WHERE age > %s', (20,)) results = cursor.fetchall() for row in results: print(row) conn.close() 注意使用%s占位符防SQL注入,不要直接拼接字符串。

预处理语句防SQL注入:预处理语句是防止SQL注入的最佳实践。cursor.execute('SELECT * FROM users WHERE name = %s AND password = %s', (username, password)) 对于LIKE查询:search = '%{}%'.format(search_term) cursor.execute('SELECT * FROM articles WHERE title LIKE %s', (search,)) 参数化查询确保用户输入被当作数据而非SQL代码执行。

事务控制:事务确保数据一致性,commit生效rollback回滚。try: cursor.execute('UPDATE accounts SET balance = balance - 100 WHERE id = 1') cursor.execute('UPDATE accounts SET balance = balance + 100 WHERE id = 2') conn.commit() except Exception as e: conn.rollback() print(f'Transaction failed: {e}') 银行转账等操作必须用事务保证原子性。

连接池管理:生产环境必须用连接池,避免频繁创建销毁连接的性能开销。from DBUtils.PooledDB import PooledDB pool = PooledDB(pymysql, 5, host='localhost', user='root', password='password', database='test', charset='utf8mb4') conn = pool.connection() cursor = conn.cursor() cursor.execute('SELECT * FROM users') conn.close() 池子会自动维护5个可用连接。

SQLAlchemy ORM入门:SQLAlchemy是Python最强大的ORM框架,将数据库表映射为Python类。from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import sessionmaker, declarative_base engine = create_engine('sqlite:///test.db') Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50)) age = Column(Integer) Session = sessionmaker(bind=engine) session = Session() users = session.query(User).filter(User.age > 20).all() for u in users: print(u.name, u.age)

SQLAlchemy CRUD操作:新增记录:new_user = User(name='李四', age=30) session.add(new_user) session.commit() 更新记录:user = session.query(User).filter(User.name == '张三').first() user.age = 26 session.commit() 删除记录:session.delete(user) session.commit() 查询:all_users = session.query(User).order_by(User.age.desc()).limit(10).all()

批量插入提升性能:逐条插入大量数据效率很低,用批量插入。data = [{'name': f'用户{i}', 'age': 20+i%30} for i in range(1000)] cursor.executemany('INSERT INTO users (name, age) VALUES (:name, :age)', data) conn.commit() SQLAlchemy批量:session.bulk_insert_mappings(User, data) session.commit()

数据库设计基础:好的数据库设计是应用稳定性的前提。CREATE TABLE orders (id INT PRIMARY KEY AUTO_INCREMENT, customer_id INT NOT NULL, order_date DATETIME NOT NULL, total DECIMAL(10,2) DEFAULT 0, status VARCHAR(20) DEFAULT 'pending', INDEX idx_customer (customer_id), INDEX idx_date (order_date), FOREIGN KEY (customer_id) REFERENCES customers(id)) 选择合适的数据类型、添加必要的索引、建立外键约束是数据库设计的基本原则。

以上就是Python数据库操作的核心知识点,建议在本地搭建MySQL或PostgreSQL环境练习。