简单来说
来自作者以外的模型
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('Author.id'))
详细资料
ForeignKey接受column作为第一个参数,该参数可以是类型
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']))
要么
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'))您需要指定 物理表 名称, 映射类 名称对此无效。



