跳到主要内容

使用 SQLAlchemy

1. 为什么需要 ORM

  • 数据库表是二维表(多行多列)。用 Python 表示:list 里每行一个 tuple,但 tuple 难以看出表结构。
  • 若用 class 实例表示一行(如 User(id, name)),结构更清晰 → 这就是 ORMObject-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 中可用 relationshipForeignKey
  • 例如 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表的一行 ↔ 一个对象,由框架做转换
Basedeclarative_base();表类继承 Base,__tablename__ + Column
连接create_engine('数据库+驱动://用户:口令@主机:端口/库名')
Sessionsessionmaker(bind=engine);add → commit → close
查询session.query(类).filter(条件).one() / .all()
关系relationship + ForeignKey 表示一对多等

记忆:ORM 表行变对象;SQLAlchemy 用 Base + Column 定义表,session 增删改查,relationship 做关联。正确使用 ORM 的前提是理解关系数据库原理