python - 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 中。它应该是一个对称的唯一约束,并且两种方式都一样。
解决方案
问题已通过使用解决
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)
它没有提供异常,但它解决了对象内部的重复。
推荐阅读
- java - 如何将第二个动作监听器变成一个对象?
- arrays - 如何从json中获取第二个元素
- java - 生成由实例变量传递的随机数的 Java 方法
- angular - module 在本地声明组件,但未导出
- angular - 通过@syncfusion/ej2-angular-calendars 在 ejs-datetimepicker 中将 datetimepicker 输入字段默认设置为空
- c++ - 编译我的代码时出错,未定义对 Class::Method() 的引用;
- c++ - C++ 对象不保存变量值
- c# - 如何在 .NET Core 3 的 Controller 的构造函数中访问 HttpContext?
- angular - 获取Angular中更改事件的选定选项值
- ml.net - ML.Net:具有多个输出的 ONNX 模型 - 推理时间差