为什么(以及如何?)sqlalchemy使用sqlite绕过FK约束? [重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么(以及如何?)sqlalchemy使用sqlite绕过FK约束? [重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
当我在进行单元测试的时候,我写了一些我知道因为外来的约束而无法通过的代码......除了它。
这是一个例子:
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?
注意:我没有尝试过另一个数据库
答案
你在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)
以上是关于为什么(以及如何?)sqlalchemy使用sqlite绕过FK约束? [重复]的主要内容,如果未能解决你的问题,请参考以下文章