我正在使用SQLAlchemy,尝试创建从多对多表到多对一表的唯一约束。就目前而言,我的很多表'B'在c_value字段中具有重复项,因此我不能在那里真正使用经典的主键/外键对。我已经研究了复合主键,但是仍然无法理解。
from sqlalchemy.orm import relationship, sessionmaker, session
from sqlalchemy.types import Integer, String
from sqlalchemy import types, MetaData, Table, Column, ForeignKey,
ForeignKeyConstraint, UniqueConstraint, CheckConstraint
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class A(Base):
__tablename__= 'a'
a_id = Column(String(),primary_key=True, nullable=False,
unique=True)
a_stuff = Column(String())
class B(Base):
__tablename__ = 'b'
b_id = Column(Integer(), index=True, nullable=False, unique=True,
primary_key=True)
a_value = Column(String(), ForeignKey('a.a_id'))
c_value = Column(String())
class C(Base):
__tablename__='c'
c_id = Column(String(),primary_key=True, nullable=False,
unique=True)
c_stuff = Column(String())
我的目标是,除非将数据添加到“ b”中,否则无法将其添加到“ b”中,除非将数据添加到“ b”中,否则无法将数据添加到“ c”中。 表'b'中的a_values和c_values多次出现,因此它们不是唯一的。我在建立SQLalchemy关系时遇到麻烦 我可以在其中使用b.c_value作为主键。
我已经尝试过ForeginKeyConstraint,例如...
__table_args__ = (ForeignKeyConstraint([c_id],[B.b_id, B.c_value]))
在B上设置关系,其中:
class B(Base):
...
c_relations = relationship("C")
class B(Base):
c_id a primary key.