python SQLAlchemy多对多的唯一约束只能单向工作

时间:2018-05-21 18:09:42

标签: python database flask orm sqlalchemy

我正在使用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。它应该是一个对称的唯一约束,并且两种方式都是一样的。

1 个答案:

答案 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) 

它没有提供异常,但它解决了对象内部的重复问题。