我想使用模型类来定义外键列。
我对此主题的google search没有帮助,所以我在这里问过。
通常我们通过物理表名称定义作为外键的列,例如引导here
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”表达式。
我们怎样才能达到目的?
答案 0 :(得分:2)
来自作者以外的模特
author_id = db.Column(db.Integer, db.ForeignKey(id))
从作者模型本身即自引用 - 只列出列名
author_id = db.Column(db.Integer, db.ForeignKey('Author.id'))
不能使用字符串值
Column
ForeignKey接受列作为第一个参数,可以是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'))
请注意,您不能以这种方式定义外键:
{{1}}
您需要指定物理表名称,映射类名称不会起作用。