我想使用模型类来定义外键列。
我对这个主题的Google搜索没有帮助,所以我在这里问。
通常我们通过物理表名定义列作为外键,例如这里
author_id = db.Column(db.Integer, db.ForeignKey('author.id'))
该短语ForeignKey('author.id')有助于将author_id列定义为外键列- 它表示表名称在talbleauthor中author。
ForeignKey('author.id')
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(Author.__table__.c.id))
从Author模型本身,即自我参考-仅列出列名称 author_id = db.Column(db.Integer, db.ForeignKey(id))
author_id = db.Column(db.Integer, db.ForeignKey(id))
不能使用字符串值 author_id = db.Column(db.Integer, db.ForeignKey('Author.id'))
author_id = db.Column(db.Integer, db.ForeignKey('Author.id'))
ForeignKey接受column作为第一个参数,该参数可以是类型Column或字符串,格式为schema_name.table_name.column_name或table_name.column_name。您在声明性模型中定义的列将转换为InstumentedAttribute对象。这就是db.ForeignKey(Author.id)导致错误的原因。您可以通过__table__模型的属性访问实际列:
Column
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']))
要么
如果您需要定义自引用外键,则只需传递列名即可。虽然模型的声明尚未完成,但它仍然具有Column类型:
id = db.Column(db.Integer, primary_key=True) parent_id = db.Column(db.Integer, db.ForeignKey(id))
请注意,您不能以这种方式定义外键:
您需要指定 物理表 名称, 映射类 名称对此无效。