SQLAlchemy中如何定义复合外键约束?
在SQLAlchemy中实现复合外键约束
嘿,刚好我之前也处理过类似的需求!你已经知道纯SQL里怎么定义复合外键了,在SQLAlchemy的Table对象里,我们不能直接在单个Column上定义复合外键,而是要用到ForeignKeyConstraint来单独声明这个约束。
具体实现步骤
- 首先需要从SQLAlchemy导入
ForeignKeyConstraint(和你导入Table、Column这些一起) - 在
Table的定义参数中,除了列的声明,添加一个ForeignKeyConstraint实例,指定本地列和关联的目标表列
完整代码示例
from sqlalchemy import Table, Column, Integer, ForeignKeyConstraint, MetaData metadata = MetaData() # 对应你要创建的available_routes表 available_routes = Table( 'available_routes', metadata, # 这里先定义表的所有列,包括复合外键用到的client_id和site_id Column('id', Integer, primary_key=True), Column('client_id', Integer, nullable=False), Column('site_id', Integer, nullable=False), # 定义复合外键约束,和你写的纯SQL对应 ForeignKeyConstraint( ['client_id', 'site_id'], # 本地表的列,顺序要和关联表的列对应 ['sites.client_id', 'sites.id'], # 关联的sites表的列,顺序必须匹配 name='fk_available_routes_sites' # 可选:指定约束名称,和纯SQL里的约束名保持一致 ) )
关键说明
- 这里的
ForeignKeyConstraint需要放在Table的参数列表里,和列定义同级 - 本地列和关联列的顺序必须严格对应:
client_id对应sites.client_id,site_id对应sites.id,和你纯SQL里的(client_id, site_id) REFERENCES sites(client_id, id)完全匹配 - 如果需要给约束指定名称,可以通过
name参数设置,这样生成的SQL会和你手动写的SQL约束名一致,方便维护
要是你用的是SQLAlchemy的声明式模型(比如继承自Base的类),写法也类似,只需要在模型的__table_args__里添加这个ForeignKeyConstraint就行,不过看你现在用的是Table对象,上面的写法就完全适用啦。
内容的提问来源于stack exchange,提问作者Dmitry Bubnenkov
相关产品推荐
相关产品推荐

