[英]SqlAlchemy - How to define a foreign key column using model class instead of physical table name
我想使用模型类来定义外键列。
我对这个主题的谷歌搜索没有帮助,所以我在这里问。
通常我们通过物理表名定义作为外键的列,例如在此处引导
author_id = db.Column(db.Integer, db.ForeignKey('author.id'))
短语ForeignKey('author.id')
有助于将列 author_id 定义为外键列 - 它指的是表author
,其中author
是表名。
我想使用模型类名,即
author_id = db.Column(db.Integer, db.ForeignKey(Author.id))
但是这段代码出错了
无法确定关系 XX.YYY 上父/子表之间的连接条件 - 没有链接这些表的外键。 确保引用列与 ForeignKey 或 ForeignKeyConstraint 关联,或指定“primaryjoin”表达式。
我们怎样才能做到呢?
来自作者以外的模特author_id = db.Column(db.Integer, db.ForeignKey(Author.__table__.c.id))
从作者模型本身即自引用 - 只需列出列名author_id = db.Column(db.Integer, db.ForeignKey(id))
不能使用字符串值author_id = db.Column(db.Integer, db.ForeignKey('Author.id'))
ForeignKey接受 column 作为第一个参数,它可以是Column
或 string 格式的schema_name.table_name.column_name
或table_name.column_name
。 您在声明性模型中定义的列将变为InstumentedAttribute
对象。 这就是db.ForeignKey(Author.id)
导致错误的原因。 您可以通过模型的__table__
属性访问实际列:
author_id = db.Column(db.Integer, db.ForeignKey(Author.__table__.c['id']))
或者
author_id = db.Column(db.Integer, db.ForeignKey(Author.__table__.c.id))
如果您需要定义自引用外键,您可以简单地传递列的名称。 虽然模型的声明尚未完成,但它仍然具有Column
类型:
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey(id))
请注意,您不能以这种方式定义外键:
author_id = db.Column(db.Integer, db.ForeignKey('Author.id'))
您需要指定物理表名,映射类名不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.