1

SQL Alchemy ORM ベースの db 定義で遊んでみます。次のようにテーブルを定義しました

class Customer(Base):
    __tablename__ = 'customer'

    id   = Column(Integer, primary_key=True)
    name = Column(String(80))

    auth   = relationship("CustomerAuth", backref='customer')



class CustomerAuth(Base):
    __tablename__ = 'authentication'

    id = Column(Integer, ForeignKey('customer.id'))
    username = Column(String(80), primary_key=True)
    passwd = Column(String(80))

今、私はセッションを作成しています

Session = sessionmaker(bind=sqla.engine)
session = Session()

そして、ID 1 と 2 を持つ Customer の 2 つの行オブジェクトを作成しようとしました

cst1 = sqla.Customer(id=1,name='shyam')
cst2 = sqla.Customer(id=2,name='ram')

そして、Customer の ID 1、2、および 3 を参照する CustomerAuth の 3 つの行オブジェクトを作成します。

auth1 = sqla.CustomerAuth(id=1,username='shyamu',passwd='wam')
auth2 = sqla.CustomerAuth(id=2,username='ramu',passwd='dam')
auth3 = sqla.CustomerAuth(id=3,username='lamu',passwd='sam')

ご覧のとおり、Customer.id を参照する外部キーである id = 3 の CustomerAuth 行を作成しました。しかし、 Customer テーブルには id=3 のエントリがないため、これは失敗するはずです

session.add(cst1)
session.add(cst2)
session.add(auth1)
session.add(auth2)
session.flush()

この操作は失敗するはずですが、成功します。

session.add(auth3)
session.flush()

外部キーの強制をバイパスして何をしていないのか知りたい

前もって感謝します

4

2 に答える 2

3

SQLAlchemy ではなく、SQLite が制約を強制します。下位互換性の理由から、SQLite には外部キーの強制を有効にする特別なパラメーターが必要です。次の質問に対する回答を参照してください: Sqlite / SQLAlchemy: 外部キーを強制する方法は?

于 2013-05-23T05:22:16.050 に答える
0

私が見つけたように、上記の@jdが指摘したように、問題はsqliteにある可能性があります。DB エンジンを mysql に変更したところ、期待どおりに動作しました。だから、sqlalchemy に直接指を向けたので、sqlalchemy ファンに謝罪します。:-)

于 2013-05-23T10:26:10.490 に答える