Python 如何使用sqllite在pytest中启用外键检查
我有一个django项目,其中的测试在调用Python 如何使用sqllite在pytest中启用外键检查,python,django,sqlite,pytest,Python,Django,Sqlite,Pytest,我有一个django项目,其中的测试在调用py.test时运行,但我最近注意到它没有检查外键约束。如何让它检查外键约束 显然,我不知道我运行的是什么版本,因为我没有sqlite的cli,但django会自动包含它吗?(我使用的是django 1.9.10),但sqlite 3是在2009年推出的,所以这不是问题所在,对吗 也许吧,但我不知道如何让我的测试做到这一点 [更新] 所以,看起来sqlite开箱即用并没有检查它们 class Referenced(models.Model): p
py.test
时运行,但我最近注意到它没有检查外键约束。如何让它检查外键约束
显然,我不知道我运行的是什么版本,因为我没有sqlite的cli,但django会自动包含它吗?(我使用的是django 1.9.10),但sqlite 3是在2009年推出的,所以这不是问题所在,对吗
也许吧,但我不知道如何让我的测试做到这一点
[更新]
所以,看起来sqlite开箱即用并没有检查它们
class Referenced(models.Model):
pass
class Referencer(models.Model):
fk = models.ForeignKey(Referenced)
>>> Referencer.objects.create(fk_id=-1)
<Referencer>
>>> Referencer.objects.all()[0].fk
DoesNotExist
引用的类(models.Model):
通过
类引用器(models.Model):
fk=型号。外键(参考)
>>>Referencer.objects.create(fk_id=-1)
>>>Referencer.objects.all()[0].fk
实干家
我最终创建了一个包来解决这个问题
pip install sqlite_checkforeignkeys
然后配置数据库:
DATABASES = {
'default': {
'ENGINE': 'sqlite_checkforeignkeys_engine',
'TEST': {'NAME': ':memory:'},
}
}
它涉及重写现有的sqlite引擎以强制执行外键
有关更多信息,请访问sqlite3附带的Python。您可以通过以下方式检查版本:
import sqlite3
sqlite3.sqlite3.sqlite_version
至于设置PRAGMA语句,这可能取决于使用的驱动程序,以及您是否在使用ORM
有了,你很多用
db = SqliteDatabase('my_app.db', pragmas=(('foreign_keys', 'on')))
它甚至在unittest(manage.py test)中也不起作用,但根据我们的理解,它应该起作用 默认情况下,django sqlite驱动程序使用延迟约束检查,这意味着约束在db commit中检查,这在测试中从未发生过。上面的罚单应该已经修好了,但显然没有 我为它提交了一个新的bug: 但是,django 2在测试之外检查sqlite的外键,例如在
/manage.py shell中