当前位置: 首页 > 面试题库 >

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

朱令
2023-03-14
问题内容

简单来说

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

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

我们怎么去呢?


问题答案:

简单来说

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

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



 类似资料:
  • 若要添加一个外键,点击工具栏的 “外键”按钮,并由子表拖拉一个字段到父表的字段。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 当你移动滑鼠到一个外键连接器时,父和子表的边界会分别变为绿色和蓝色。此外,父和子表的参考属性均会高亮显示。 在画布中外键对象的弹出式菜单选项包括: 选项 描述 设计关系 在表设计器中编辑外键。 基数在 表名1 设置基数在表名1:无、唯一、多个

  • 若要添加一个外键,点击工具栏的 “外键”按钮,并由子表拖拉一个字段到父表的字段。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 当你移动滑鼠到一个外键连接器时,父和子表的边界会分别变为绿色和蓝色。此外,父和子表的参考属性均会高亮显示。 在画布中外键对象的弹出式菜单选项包括: 选项 描述 设计关系 在表设计器中编辑外键。 基数在 表名1 设置基数在表名1:无、唯一、多个

  • 问题内容: 我有这个SQL查询: 我想在执行完之后在10个表中执行该SQL 。 有什么办法吗?定义变量或其他内容? 我正在SQL Server Management Studio 10(= SQL Server 2008)中运行查询 问题答案: 使用动态SQL 这是 非常 使用的重要QUOTENAME处理,因为SQL注入风险的动态SQL时。动态SQL具有优缺点,有关详细讨论,请参见《动态SQL的诅

  • 现有的PostgreSQL数据库具有以不同“模式”组织的表,以拆分大型数据库(用于在服务器级别扩展和实现微调的安全性)。类似地,声明性_基表描述组织在包中的不同文件中-每个模式一个文件: 元数据和引擎对象作为。例如,图1中的表。py将有(忽略必要的ORM导入,然后需要反向引用)表alpha: 现在在图2中的表中。py,定义了两个表。一个是称为beta的独立表,另一个是alpha和beta之间的一对

  • 问题内容: 我正在尝试构建可在Flask和其他非Flask服务中使用的SQLAlchemy模型。我知道,为了在Flask中使用这些对象,我可以使用Flask- SQLAlchemy模块并构建如下模型: app_builder.py database.py 但是,这样做似乎将模型与使用flask_sqlalchemy绑定在一起。我还有一个服务,我想在不使用flask的情况下使用这些模型。有没有一种方