SqlAlchemy - 如何使用模型类而不是物理表名来定义外键列

时间:2017-01-13 10:35:43

标签: python sqlalchemy

简而言之

我想使用模型类来定义外键列。

我对此主题的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”表达式。

我们怎样才能达到目的?

1 个答案:

答案 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_nameInstumentedAttribute格式的字符串。您在声明性模型中定义的列转向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}}

您需要指定物理表名称,映射类名称不会起作用。