我正在使用python 2.7和sqlAlchemy over sqllite,在一个烧瓶应用程序中,并试图映射两个模型之间的关系,模型是Lad和Crew,一个Lad可以有许多工作人员和反对,唯一的限制是这一对应该是唯一的,例如一个小伙子只能在一个工作人员一次,反之亦然,我已经建立了模型,并且当试图将工作人员添加到同一个小伙子两次时,主要的限制因素限制了我,但是当我试图将同一个小伙子加入船员两次时,它会让我这样做,这也应该被禁止。
peopleInCrews = Table("peopleInCrewsAssosiation", Base.metadata,
Column("A", Integer, ForeignKey("lads.id", ondelete="CASCADE", onupdate="CASCADE"), primary_key=True),
Column("B", Integer, ForeignKey("crews.id", ondelete="CASCADE", onupdate="CASCADE"), primary_key=True),
PrimaryKeyConstraint("A", "B"))
class Lad(Base):
__tablename__ = 'lads'
id = Column(Integer, primary_key=True, autoincrement=True)
firstName = Column(String(50), unique=False)
lastName = Column(String(50), unique=False)
crews = relationship("Crew", secondary=peopleInCrews, back_populates="lads")
class Crew(Base):
__tablename__ = 'crews'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(20), unique=False)
lads = relationship("Lad", secondary = peopleInCrews, back_populates = "crews")#, cascade = "all, delete")
当我开始创建一个小伙子和一个团队如下:
c = Crew("name")
l = Lad("first", "last")
以下代码会引发重复错误:
c.lads.append(lad)
c.lads.append(lad)
以下代码预计会做同样的事情,但只是将两个小伙子添加到crew.lads:
l.crews.append(c)
l.crews.append(c)
我在这里缺少什么?
编辑: 有些人认为这个问题类似于jsfiddle,这里的不同之处在于我使用的是primaryKeyConstraint,并且它在一个方向上工作而不是在另一个方向上工作。例如你可以将相同的工作人员两次添加到Lad.crews,但是你不能将同一个小伙子添加到Crew.lads。它应该是一个对称的唯一约束,并且两种方式都是一样的。
答案 0 :(得分:0)
使用
解决了这个问题db_session.add(c)
db_session.add(l)
c.lads.append(lad)
c.lads.append(lad)
l.crews.append(c)
l.crews.append(c)
db_session.refresh(lad)
db_session.refresh(c)
它没有提供异常,但它解决了对象内部的重复问题。