Python 如何使用sqllite在pytest中启用外键检查

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

我有一个django项目,其中的测试在调用
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中