使用 SQLAlchemy
1. 为什么需要 ORM
- 数据库表是二维表(多行多列)。用 Python 表示:list 里每行一个 tuple,但 tuple 难以看出表结构。
- 若用 class 实例表示一行(如
User(id, name)),结构更清晰 → 这就是 ORM:Object-Relational Mapping,把关系数据库的表结构映射到对象;由 ORM 框架完成转换。 - Python 中最有名的 ORM 框架是 SQLAlchemy。
2. 安装与基本结构
pip install sqlalchemy
- 连接字符串格式:
'数据库类型+驱动://用户名:口令@主机:端口/ 数据库名',如 MySQL:mysql+mysqlconnector://root:password@localhost:3306/test。 - 基类:
Base = declarative_base();表对应的类继承 Base,用__tablename__指定表名,用Column(类型, primary_key=...)定义列。
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(String(20), primary_key=True)
name = Column(String(20))
engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
DBSession = sessionmaker(bind=engine)
create_engine()初始化数据库连接;DBSession = sessionmaker(bind=engine)得到 Session 类型;DBSession 可视为“当前数据库连接”的工厂。
3. 添加记录
- 获取 session → 创建对象 →
session.add(对象)→session.commit()→session.close()。
session = DBSession()
new_user = User(id='5', name='Bob')
session.add(new_user)
session.commit()
session.close()
4. 查询
- 用
session.query(类).filter(条件).one()或.all();one() 返回唯一一行(多行或无会报错),all() 返回所有行;结果是对象而非 tuple。
session = DBSession()
user = session.query(User).filter(User.id == '5').one()
print(type(user), user.name) # <class 'User'> Bob
session.close()
- ORM 的作用:表的一行 ↔ 一个对象,互相自动转换。
5. 一对多关系
- 表之间可用外键表示一对多、多对多;ORM 中可用
relationship与ForeignKey。 - 例如 User 拥有多个 Book:在 User 上设
books = relationship('Book');在 Book 上设user_id = Column(..., ForeignKey('user.id'))。查询 User 时,user.books 为包含多个 Book 对象的 list。
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
class User(Base):
__tablename__ = 'user'
id = Column(String(20), primary_key=True)
name = Column(String(20))
books = relationship('Book')
class Book(Base):
__tablename__ = 'book'
id = Column(String(20), primary_key=True)
name = Column(String(20))
user_id = Column(String(20), ForeignKey('user.id'))
6. 小结
| 要点 | 说明 |
|---|---|
| ORM | 表的一行 ↔ 一个对象,由框架做转换 |
| Base | declarative_base();表类继承 Base,__tablename__ + Column |
| 连接 | create_engine('数据库+驱动://用户:口令@主机:端口/库名') |
| Session | sessionmaker(bind=engine);add → commit → close |
| 查询 | session.query(类).filter(条件).one() / .all() |
| 关系 | relationship + ForeignKey 表示一对多等 |
记忆:ORM 表行变对象;SQLAlchemy 用 Base + Column 定义表,session 增删改查,relationship 做关联。正确使用 ORM 的前提是理解关系数据库原理。