如何在pytest中使用sqlli启用foreignkey检查

2024-04-26 00:59:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个django项目,其中的测试在我调用py.test时运行,但我最近注意到它没有检查外键约束。如何让它检查外键约束?在

显然,foreign key constraints weren't even possible until sqlite 3,但我不知道我运行的是哪个版本,因为我没有sqlite的cli,但它只是由django自动包含?(我使用的是django1.9.10),但是sqlite3是在2009年发布的,所以这不是问题所在,对吗?在

也许是{a2},但我不知道如何让我的测试做到这一点?在

[更新] 所以,看起来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

Tags: 项目djangokeypytestsqlitemodelobjects
3条回答

最后我创建了一个包来解决这个问题。在

pip install sqlite_checkforeignkeys

然后配置数据库:

^{pr2}$

它涉及重写现有的sqlite引擎以强制执行外键

更多信息请访问https://github.com/hulu/sqlite_checkforeignkeys

即使在unittest中也不起作用(管理.py但是根据https://code.djangoproject.com/ticket/11665它应该可以工作。在

django-sqlite驱动程序默认使用延迟约束检查,这意味着在db commit中检查约束,这在测试中从不发生。上面的罚单应该已经修好了,但显然没有

我为它提交了一个新的错误:https://code.djangoproject.com/ticket/29928

但是,django 2在测试之外检查sqlite的外键,例如在./manage.py shell

Python附带sqlite3。你可以通过

import sqlite3
sqlite3.sqlite3.sqlite_version

至于PRAGMA语句的设置,可能取决于使用的驱动程序,以及使用ORM的时间。在

使用peewee,您可以使用

^{pr2}$

相关问题 更多 >