@[toc] 更多技术干货欢迎关注微信公众号“科威舟的AI笔记”~
Python数据库操作:从基础连接到实战应用
本文针对初中级Python开发者,系统讲解数据库连接、操作与事务管理,最后通过完整项目实战强化技能。
一、数据库连接:SQLite与MySQL的桥梁
1. 原生库连接(轻量级场景)
原理:Python通过DB-API规范提供统一数据库接口,不同数据库需安装对应驱动:
- SQLite:Python内置
sqlite3,数据存储在单文件中 - MySQL:需安装
PyMySQL或mysql-connector
实战代码:
# SQLite连接
import sqlite3
conn_sqlite = sqlite3.connect('library.db') # 自动创建数据库文件
# MySQL连接(需先安装PyMySQL)
import pymysql
conn_mysql = pymysql.connect(
host='localhost',
user='root',
password='yourpassword',
database='library',
charset='utf8mb4'
)
2. ORM连接(企业级应用)
原理:ORM(对象关系映射)将数据库表转为Python类,SQL操作转为方法调用。SQLAlchemy是Python最流行的ORM框架。
实战代码:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker
# 定义基类和模型
Base = declarative_base()
class Book(Base):
__tablename__ = 'books'
id = Column(Integer, primary_key=True)
title = Column(String(100), nullable=False)
author = Column(String(50))
isbn = Column(String(13))
# 创建引擎和会话(支持SQLite/MySQL)
engine = create_engine('sqlite:///library.db')
# 或 MySQL:mysql+pymysql://user:password@localhost/library
Session = sessionmaker(bind=engine)
session = Session()
二、CRUD与事务管理:数据操作核心 ⭐️
1. CRUD操作四要素
| 操作 | SQL命令 | ORM方法 | 原生游标方法 |
|---|---|---|---|
| 创建 | INSERT | session.add() | cursor.execute() |
| 读取 | SELECT | session.query() | cursor.fetchall() |
| 更新 | UPDATE | session.commit() | cursor.execute() |
| 删除 | DELETE | session.delete() | cursor.execute() |
参数化查询防注入(关键安全实践):
# 错误方式(有注入风险)
cursor.execute(f"SELECT * FROM users WHERE name='{username}'")
# 正确方式(使用占位符)
cursor.execute("SELECT * FROM users WHERE name=%s", (username,)) # MySQL
cursor.execute("SELECT * FROM users WHERE name=?", (username,)) # SQLite
2. 事务管理原理
事务的ACID特性(原子性、一致性、隔离性、持久性)通过以下实现:
BEGIN:开启事务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("事务失败:", e)
三、实战:图书管理系统(数据库版)
1. 数据库设计
创建books表结构:
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT,
isbn TEXT UNIQUE,
status TEXT DEFAULT 'AVAILABLE' -- 状态:AVAILABLE/BORROWED
);
2. 核心类实现(使用SQLAlchemy ORM)
class BookManager:
def __init__(self):
self.engine = create_engine('sqlite:///library.db')
Base.metadata.create_all(self.engine)
self.Session = sessionmaker(bind=self.engine)
def add_book(self, title, author, isbn):
session = self.Session()
try:
book = Book(title=title, author=author, isbn=isbn)
session.add(book)
session.commit()
print(f"添加成功:{title}")
except Exception as e:
session.rollback()
print("添加失败:", e)
finally:
session.close()
def borrow_book(self, book_id):
session = self.Session()
try:
book = session.query(Book).get(book_id)
if book and book.status == 'AVAILABLE':
book.status = 'BORROWED'
session.commit()
return True
return False
finally:
session.close()
# 补充:查询/归还/删除方法(完整代码见文末GitHub链接)
3. 功能测试
manager = BookManager()
manager.add_book("Python编程:从入门到实践", "Eric Matthes", "9787115428028")
# 借阅ID为1的书籍
if manager.borrow_book(1):
print("借阅成功!")
else:
print("书籍不可借")
4. 事务应用场景
批量导入书籍时保持原子性:
def import_books(book_list):
session = Session()
try:
for book_data in book_list:
session.add(Book(**book_data))
session.commit() # 全部成功才提交
except:
session.rollback() # 任一失败则回滚
print("批量导入失败,已回滚")
四、性能优化与安全建议
- 连接池技术:高并发场景使用
SQLAlchemy的QueuePoolengine = create_engine('sqlite:///library.db', poolclass=QueuePool, pool_size=5) - 索引优化:为常查询字段(如
isbn)添加索引加速检索 - 环境变量管理:敏感信息(数据库密码)从环境变量读取
import os password = os.getenv('DB_PASSWORD')
下期预告:Python的Web开发基础
- Flask vs Django框架对比
- 路由与视图函数设计
- 模板引擎与表单处理
- RESTful API开发实战
通过本文,你已掌握数据库操作的核心技能。关键要点:ORM提升开发效率、事务保证数据安全、参数化查询防注入。在实际项目中灵活运用这些技术,将大幅提升代码质量与系统可靠性。