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

使用sqlalchemy的组合键上的关系

乜业
2023-03-14
问题内容

我有一个简单的Author-Books模型,找不到将firstName和lastName用作复合键并在关系中使用它的方法。有任何想法吗?

from sqlalchemy import create_engine, ForeignKey, Column, String, Integer
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
engine = create_engine('mssql://user:pass@library')
engine.echo = True
session = sessionmaker(engine)()

class Author(Base):
    __tablename__ = 'authors'
    firstName = Column(String(20), primary_key=True)
    lastName = Column(String(20), primary_key=True)
    books = relationship('Book', backref='author')

class Book(Base):
    __tablename__ = 'books'
    title = Column(String(20), primary_key=True)
    author_firstName = Column(String(20), ForeignKey('authors.firstName'))
    author_lastName = Column(String(20), ForeignKey('authors.lastName'))

问题答案:

问题在于您已将每个相关列分别定义为外键,如果这不是您想要的,那么您当然需要一个复合外键。Sqlalchemy通过说(以一种不太清楚的方式)对此做出响应,即无法猜测要使用哪个外键(firstNamelastName)。

声明复合外键的解决方案在声明性上有点笨拙,但仍然很明显:

class Book(Base):
    __tablename__ = 'books'
    title = Column(String(20), primary_key=True)
    author_firstName = Column(String(20))
    author_lastName = Column(String(20))
    __table_args__ = (ForeignKeyConstraint([author_firstName, author_lastName],
                                           [Author.firstName, Author.lastName]),
                      {})

这里重要的是ForeignKey定义从各个列中删除,并且将aForeignKeyConstraint添加__table_args__类变量中。有了这个,relationship定义就Author.books可以了。



 类似资料:
  • 问题内容: 我有一个用户表和一个朋友表。朋友表拥有两个外键,分别指向我的用户表和状态字段。我试图能够从Friend对象上的User表中调用属性。例如,我希望能够执行诸如friend.name或friend.email之类的操作。 当我得到对象时,我所拥有的只是2,并且我想显示每个用户的所有属性,以便可以在表单等中使用该信息。我对sqlalchemy还是陌生的- 仍在尝试学习更高级的功能。这只是一个

  • 问题内容: 在一个软件中,我将两个数组与函数合并。但是我需要将相同的数组(当然,具有相同的键)添加到现有数组中。 问题: 如您所见,错过了。 那么,如何将 所有这些 具有相同的键合并? 问题答案: 您需要使用而不是。当然,数组中只能有一个等于的键,但是关联的值将是包含和的数组。

  • 问题内容: 按照前面的链接(如何发送键盘输出),Java可以模拟使用Robot类按下的键。但是,如何模拟按键组合?如果我想发送组合“ alt-123”,可以使用机器人吗? 问题答案: 简单的答案是。基本上,你需要用的的周围的其他小号

  • 我们系统的所有用户都来自一个主“用户”类。同样,我们希望以相同的方式构造数据库,拥有一个主“用户”表,该表与特定用户类型的必要表连接,以提供额外的用户信息。 以这三个基本表格为例: 表用户 user_id|user_email|user_firstname|user_lastname|... 表雇员 user_id|employee_staff_number|... 表管理 user_id|adm

  • 我猜这是一个教义错误(我在JIRA问题跟踪器上提交了一个问题),但万一只是用户错误,我决定在这里发布它。 使用由2个外键和一个元数据字段组成的复合主键在联接表中持久化实体集合在某些情况下会失败。代码是以这里的指令为基础的:条令文件 调试日志: 失败:当外键%1在集合中的项之间相同,并且外键%2小于任何现有外键%2时,工作单元尝试插入现有实体,但不对新实体进行操作。 > 示例:GPA“add val

  • DemandEntity:实体本身 伙伴关系: 这种方法导致一个例外: 不幸的是,我无法添加另一个联接列 因为PART表不包含ORDER字段,并且数据库的结构无法更改。 有没有办法执行这样的映射?