为什么(以及如何?)sqlalchemy使用sqlite绕过FK约束? [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

当我在进行单元测试的时候,我写了一些我知道因为外来的约束而无法通过的代码......除了它。

这是一个例子:

import os
import sqlalchemy as sa
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base, declared_attr
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

try:
  os.unlink('test.db')
except:
  pass
engine = create_engine('sqlite:///test.db')

Base = declarative_base()

class Test1(Base):
  __tablename__ = 'Test1'
  id = sa.Column(sa.Integer(), primary_key = True)

class Test2(Base):
  __tablename__ = 'Test2'
  id = sa.Column(sa.Integer(), primary_key = True)
  link = sa.Column(sa.Integer(), sa.ForeignKey(Test1.id), index = True)

Base.metadata.create_all(engine)

Session = sessionmaker()

session = Session(bind=engine)

session.add(Test2(id=1, link=2)) # <-- should raise an error because 2 not in Test1
session.commit()
session.add(Test1(id=1))
session.commit()
session.add(Test2(id=2, link=1)) #ok
session.commit()
session.add(Test2(id=3, link=42)) # <-- should raise an error because 42 not in Test1
session.commit()

我宣布一个简单的数据库,一个表Test1与PK id,和第二个表Test2与PK id和一个FK约束在Test2.link参考Test1.id。然后,我插入一些会破坏FK的值。

FK似乎工作,因为如果我打开一个sqlite数据库浏览器,我不能把这些相同的值...

sqlalchemy为何以及如何绕过FK?

注意:我没有尝试过另一个数据库

python sqlite sqlalchemy
1个回答
1
投票

你在SQLite中开启了执法吗?

> PRAGMA foreign_keys = ON;

related question。要在代码中启用此功能,可以使用

engine = create_engine(database_url)
engine.execute('PRAGMA foreign_keys=ON')

这个other answer有一个使用侦听器/事件在连接上运行它的示例。

def _fk_pragma_on_connect(dbapi_con, con_record):
    dbapi_con.execute('PRAGMA foreign_keys=ON')

from sqlalchemy import event
event.listen(engine, 'connect', _fk_pragma_on_connect)
© www.soinside.com 2019 - 2024. All rights reserved.