【发布时间】:2012-01-09 18:12:33
【问题描述】:
我有两个表 testInstance 和 bugzilla 由第三个表 bzCheck 关联,如下所示:
class Instance(Base):
__tablename__ = "testInstance"
id = Column(Integer, primary_key=True)
bz_checks = relation(BZCheck, backref="instance")
class BZCheck(Base):
__tablename__ = "bzCheck"
instance_id = Column(Integer, ForeignKey("testInstance.id"), primary_key=True)
bz_id = Column(Integer, ForeignKey("bugzilla.id"), primary_key=True)
status = Column(String, nullable=False)
bug = relation(Bugzilla, backref="checks")
class Bugzilla(Base):
__tablename__ = "bugzilla"
id = Column(Integer, primary_key=True)
后端是一个postgresql服务器;我正在使用 SQLalchemy 0.5
如果我创建了 Instance、Bugzilla 和 BZCheck 对象,那么就这样做
bzcheck.bug = bugzilla
instance.bz_checks.append(bzcheck)
然后添加并提交它们;一切都很好。
但是现在,让我们假设我有一个现有的实例和一个现有的 bugzilla,并希望将它们关联起来:
instance = session.query(Instance).filter(Instance.id == 31).one()
bugzilla = session.query(Bugzilla).filter(Bugzilla.id == 19876).one()
check = BZCheck(status="OK")
check.bug = bugzilla
instance.bz_checks.append(check)
失败了:
In [6]: instance.bz_checks.append(check)
2012-01-09 18:43:50,713 INFO sqlalchemy.engine.base.Engine.0x...3bd0 select nextval('"bzCheck_instance_id_seq"')
2012-01-09 18:43:50,713 INFO sqlalchemy.engine.base.Engine.0x...3bd0 None
2012-01-09 18:43:50,713 INFO sqlalchemy.engine.base.Engine.0x...3bd0 ROLLBACK
它尝试从不存在的序列中获取新 ID,而不是使用外键“testInstance.id”...我不明白为什么。 在提交对象后尝试修改对象时,我遇到了类似的问题;我应该错过一些基本的东西,但是什么?
【问题讨论】:
-
你为什么不使用最新版本,.7?
-
因为最终使用它的机器运行的发行版只有 0.5.8,我想避免手动安装
标签: python sql orm sqlalchemy