)
一、常用字段类型SQLAlchemy 的字段类型大致分为四类整数、浮点/定点、字符串、日期时间。1. 整数类型类型说明对应 SQLInteger标准整数INTSmallInteger小整数SMALLINTBigInteger大整数BIGINTfrom sqlalchemy import Column, Integer, BigInteger id Column(Integer, primary_keyTrue, autoincrementTrue) big_num Column(BigInteger)2. 浮点与定点类型类型说明适用场景Float浮点数科学计算Numeric/DECIMAL定点数金额必须用这个from sqlalchemy import Column, Float, Numeric price Column(Numeric(10, 2)) # 总共 10 位2 位小数 score Column(Float)原则金额必须用Numeric不能用Float否则会有精度丢失。3. 字符串类型类型说明适用场景String(n)变长字符串最大 n 字符用户名、邮箱Text长文本文章内容、备注Unicode(n)Unicode 字符串多语言支持UnicodeTextUnicode 长文本中文长文本from sqlalchemy import Column, String, Text, Unicode name Column(String(50)) content Column(Text) title Column(Unicode(200))4. 日期时间类型类型说明Date日期年月日Time时间时分秒DateTime日期 时间Interval时间间隔from sqlalchemy import Column, Date, Time, DateTime from datetime import datetime birthday Column(Date) created_at Column(DateTime, defaultdatetime.now) updated_at Column(DateTime, defaultdatetime.now, onupdatedatetime.now)onupdate会在每次更新记录时自动刷新时间。5. 布尔与枚举from sqlalchemy import Column, Boolean, Enum is_active Column(Boolean, defaultTrue) status Column(Enum(pending, paid, shipped, nameorder_status))6. JSON 类型from sqlalchemy import Column, JSON metadata Column(JSON)适合存储结构不固定的数据。7. 二进制类型from sqlalchemy import Column, LargeBinary avatar Column(LargeBinary)注意大文件不应该存数据库应该存对象存储数据库只存 URL。二、字段约束约束用于保证数据的完整性。约束参数说明主键primary_keyTrue唯一标识每一行非空nullableFalse不允许为空唯一uniqueTrue值不能重复默认值default值插入时的默认值索引indexTrue创建索引注释comment说明字段说明外键ForeignKey(表.列)引用其他表from sqlalchemy import Column, Integer, String, ForeignKey class User(Base): __tablename__ users id Column(Integer, primary_keyTrue, autoincrementTrue) name Column(String(50), nullableFalse, comment用户名) email Column(String(100), uniqueTrue, indexTrue, comment邮箱) age Column(Integer, default0) dept_id Column(Integer, ForeignKey(departments.id))三、关系映射关系映射是 ORM 最强大的功能可以用 Python 对象访问关联数据。1. 一对多最常见的场景一个用户有多个订单。from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship class User(Base): __tablename__ users id Column(Integer, primary_keyTrue) name Column(String(50)) # 一个用户有多个订单 orders relationship(Order, back_populatesuser) class Order(Base): __tablename__ orders id Column(Integer, primary_keyTrue) amount Column(Numeric(10, 2)) user_id Column(Integer, ForeignKey(users.id)) # 每个订单属于一个用户 user relationship(User, back_populatesorders)使用# 通过用户访问订单 user session.query(User).first() for order in user.orders: print(order.amount) # 通过订单访问用户 order session.query(Order).first() print(order.user.name)2. 一对一用uselistFalse标记。class User(Base): __tablename__ users id Column(Integer, primary_keyTrue) name Column(String(50)) # 一对一一个用户只有一个 profile profile relationship(Profile, back_populatesuser, uselistFalse) class Profile(Base): __tablename__ profiles id Column(Integer, primary_keyTrue) bio Column(Text) user_id Column(Integer, ForeignKey(users.id)) user relationship(User, back_populatesprofile)3. 多对多需要用中间表。from sqlalchemy import Table # 中间表 user_role Table( user_role, Base.metadata, Column(user_id, Integer, ForeignKey(users.id), primary_keyTrue), Column(role_id, Integer, ForeignKey(roles.id), primary_keyTrue), ) class User(Base): __tablename__ users id Column(Integer, primary_keyTrue) name Column(String(50)) # 多对多 roles relationship(Role, secondaryuser_role, back_populatesusers) class Role(Base): __tablename__ roles id Column(Integer, primary_keyTrue) name Column(String(50)) users relationship(User, secondaryuser_role, back_populatesroles)4. 自关联一个表自己关联自己比如员工和上级。class Employee(Base): __tablename__ employees id Column(Integer, primary_keyTrue) name Column(String(50)) manager_id Column(Integer, ForeignKey(employees.id)) # 自关联 manager relationship(Employee, remote_side[id], backrefsubordinates)使用emp session.query(Employee).first() print(emp.manager.name) # 上级 for sub in emp.subordinates: # 下属 print(sub.name)四、relationship 的参数参数说明back_populates双向关系的对应字段backref自动生成反向引用简化写法secondary多对多的中间表uselistFalse一对一时设为 Falsecascade级联操作删除、更新lazy加载策略select / joined / subqueryforeign_keys明确指定外键多外键时用常用 cascade 配置orders relationship( Order, back_populatesuser, cascadeall, delete-orphan # 删除用户时连带删除订单 )cascade 值说明save-update默认保存/更新时级联delete删除时级联delete-orphan删除父对象时删除孤儿子对象all包含所有五、索引与表级约束1. 单列索引email Column(String(100), indexTrue)2. 联合索引from sqlalchemy import Index class User(Base): __tablename__ users id Column(Integer, primary_keyTrue) first_name Column(String(50)) last_name Column(String(50)) # 联合索引 __table_args__ ( Index(idx_name, first_name, last_name), )3. 唯一约束from sqlalchemy import UniqueConstraint class User(Base): __tablename__ users id Column(Integer, primary_keyTrue) email Column(String(100)) phone Column(String(20)) __table_args__ ( UniqueConstraint(email, phone, nameuix_email_phone), )4. 表级其他参数class User(Base): __tablename__ users __table_args__ ( {comment: 用户表, mysql_engine: InnoDB}, )