0

假设我有三张桌子。

class A(Base):
  id = Column(Integer, primary_key=True)
  bs = association_proxy("a_b", "b")

class B(Base):
  id = Column(Integer, primary_key=True)
  extra = Column(String(10), nullable=True)
  as = association_proxy("a_b", "a")

class A_B(Base):
  __table_args__ = (
    UniqueConstraint('a_id', 'b_extra'),
    )
  a_id = Column(Integer, ForeignKey('A.id'), primary_key=True)
  b_id = Column(Integer, ForeignKey('B.id'), primary_key=True)
  b_extra = column_property(
    select([B.extra]).where(B.id=b_id)
    )
  b = relationship("B", backref="a_b")
  a = relationship("A", backref="a_b")

和一个数据库模式:

CREATE TABLE A (
  id INT(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (id)
)
CREATE TABLE B (
  id INT(11) NOT NULL AUTO_INCREMENT,
  extra INT(11) NOT NULL,
  PRIMARY KEY (id)
)
CREATE TABLE A_B (
  a_id INT(11) NOT NULL,
  b_id INT(11) NOT NULL,
  b_extra INT(11) NOT NULL,
  UNIQUE KEY ('a_id', 'b_extra'),
  KEY a_id,
  KEY b_id,
  CONSTRAINT FOREIGN KEY ('b_extra') REFERENCES 'B' ('extra'),
  CONSTRAINT FOREIGN KEY ('b_id') REFERENCES 'B' ('id'),
  CONSTRAINT FOREIGN KEY ('a_id') REFERENCES 'A' ('id')
)

这个想法是 A_B 是 A 和 B 之间的关联表。B 中的额外数据不是每个 B 唯一的,但每个 A都是唯一的。我遇到的问题是,当我尝试运行脚本时,我得到Key Error: b_extra. 我已经尝试了所有我能想到的肮脏技巧,但我不知道如何解决这个问题。

编辑:为了澄清,我希望 column_property 存在于数据库中并像往常一样参与更新和插入。

这是实际应用程序的一个稍微简化的示例,因为它太复杂,无法在此处发布。

4

1 回答 1

0

这里的问题是您的 A_B 表有一个名为“b_extra”的列,但是在您的 A_B 映射中,您使用列属性覆盖“b_extra”,该列属性试图在不同的表上加载不同的列,“B.extra ”。

此处的意图尚不清楚,但似乎您会摆脱 A_B.b_extra ,因为您似乎不想给它写任何东西。或者,如果您确实希望 B.extra 和 A_B.b_extra 同时存在,则需要将这两个表达式映射到不同的名称。

A_B.b_extra 列属性也有点奇怪,因为在会话到期之间,它不会与该属性的关系路由保持同步,这只是 some_a_b.b.extra。

于 2013-04-16T23:36:27.607 回答