假设我有三张桌子。
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存在于数据库中,并像平常一样参与更新和插入。
这是一个与实际应用程序相关的略微简化的示例,因为它太复杂而无法在此处发布。
答案 0 :(得分: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。