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

发布于 2021-01-29 15:03:58

简单来说

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

我对这个主题的Google搜索没有帮助,所以我在这里问。

在全

通常我们通过物理表名定义列作为外键,例如这里

author_id = db.Column(db.Integer, db.ForeignKey('author.id'))

该短语ForeignKey('author.id')有助于将author_id列定义为外键列-
它表示表名称在talbleauthorauthor

我想使用模型类名称,即

author_id = db.Column(db.Integer, db.ForeignKey(Author.id))

但是这段代码出错

无法确定关系XX.YYY的父/子表之间的连接条件-
没有链接这些表的外键。确保引用列与ForeignKey或ForeignKeyConstraint关联,或指定“ primaryjoin”表达式。

我们怎么去呢?

关注者
0
被浏览
62
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    简单来说

    • 来自作者以外的模型
      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_nametable_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'))
    

    您需要指定 物理表 名称, 映射类 名称对此无效。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看