首页 > 解决方案 > python SQLAlchemy多对多唯一约束仅以一种方式工作

问题描述

我在烧瓶应用程序中使用带有sqlAlchemy的python 2.7,并尝试映射两个模型之间的关系,模型是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)

下面的代码预计会做同样的事情,但只是将小伙子两次添加到 cramp.lads 中:

l.crews.append(c)
l.crews.append(c) 

我在这里想念什么?

编辑:有人建议这个问题与这个问题相似这里的不同之处在于我使用的是primaryKeyConstraint,并且它在一个方向上工作而不是在另一个方向上工作。例如,您可以将同一个小伙子添加到 Lad.crews 中两次,但您不能将同一个小伙子添加到 Crew.lads 中。它应该是一个对称的唯一约束,并且两种方式都一样。

标签: pythondatabaseflaskormsqlalchemy

解决方案


问题已通过使用解决

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) 

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


推荐阅读