Python SQLAlchemy много ко многим уникальным ограничениям, работающим только в одну сторону - PullRequest
0 голосов
/ 21 мая 2018

Я использую Python 2.7 с sqlAlchemy поверх 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) 

Что мне здесь не хватает?

Редактировать: Некоторые предположили, что этот вопрос похож на этот . Что здесь отличается, так это то, что я использую primaryKeyConstraint и что он работает в одном направлении, а не в другом направлении,Например, вы можете добавить одну и ту же команду дважды в Lad.crews, но вы не можете добавить одного и того же парня в Crew.lads.он должен быть симметричным уникальным ограничением и работать одинаково в обоих направлениях.

1 Ответ

0 голосов
/ 22 мая 2018

Проблема была решена с помощью

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) 

Это не обеспечило исключение, но решило дублирование внутри объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...