具有复制SQLAlchemy的Composite PrimaryKey

时间:2018-11-07 21:28:32

标签: python sqlalchemy

我正在使用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.

0 个答案:

没有答案