【问题标题】:Enable integrity checking with sqlite in django在 django 中使用 sqlite 启用完整性检查
【发布时间】:2011-10-08 09:56:39
【问题描述】:

在我的 django 项目中,我使用 mysql db 进行生产,使用 sqlite 进行测试。

问题是,我的一些代码依赖于模型完整性检查。它与mysql配合良好,但在测试中执行相同代码时不会抛出完整性错误。

我知道必须在 sqlite 中激活外键检查:

PRAGMA foreign_keys = 1;

但是,我不知道执行此激活的最佳方法是在哪里 (same question here)。

此外,以下代码将不起作用:

def test_method(self):
    from django.db import connection
    cursor = connection.cursor()
    cursor.execute('PRAGMA foreign_keys = ON')
    c = cursor.execute('PRAGMA foreign_keys')
    print c.fetchone()
    >>> (0,)

有什么想法吗?

【问题讨论】:

  • 为什么不使用生产中使用的测试数据库?测试环境的目的不是重现生产环境吗?*
  • 使用time python manage.py test products 测试单个应用程序。 mysql:0m58.232s。 Sqlite : 0m5.153s.
  • 这里没有一个解决方案的开始,但看起来很多讨论(和补丁)正在这张票上讨论你在这里提出的问题code.djangoproject.com/ticket/11665
  • @Thibault J:我知道这就是原因,但是在测试中,测试适合实际情况不是更重要吗?我目前处于同样的情况,测试和产品之间的 DBMS 不同,而且我有一些严重的 WTF,即使我使用的是 ORM。
  • @Clement 这确实非常重要。但是我正在使用 TDD,我不能等待 60 秒才能对每一行代码运行一次测试。在我的持续集成平台上,测试在 mysql 下运行。

标签: django sqlite pragma integrity


【解决方案1】:

您可以使用 django 信号,收听post_syncdb

from django.db.models.signals import post_syncdb

def set_pragma_on(sender, **kwargs):
    "your code here"

post_syncdb.connect(set_pragma_on)

这可确保无论何时运行 syncdb(运行syncdb,在创建测试数据库时),您的 SQLite 数据库已将“pragma”设置为“on”。您应该在上述方法“set_pragma_on”中检查您使用的数据库。

【讨论】:

  • 您的答案并不完全正确,但它引导我找到了正确的解决方案(请参阅我在同一页上的答案)。非常感谢。
  • 这不会产生预期的效果:post_syncdb 命令仅在syncdb 之后运行,而不适用于任何其他连接(并且 pragma 不会持续超出当前连接)。
【解决方案2】:

所以,如果终于找到了正确答案。我所要做的就是将此代码添加到我已安装应用程序之一的__init__.py 文件中:

from django.db.backends.signals import connection_created


def activate_foreign_keys(sender, connection, **kwargs):
    """Enable integrity constraint with sqlite."""
    if connection.vendor == 'sqlite':
        cursor = connection.cursor()
        cursor.execute('PRAGMA foreign_keys = ON;')

connection_created.connect(activate_foreign_keys)

【讨论】:

  • 这似乎不适用于在同步数据库期间添加的initial data
  • 一定要删除不创建外键的旧迁移文件,否则不会创建外键。我被这个困了一段时间。
  • 虽然我删除了我的数据库文件,删除了所有以前的迁移,并创建了新的迁移,但这对我没有任何影响。未按预期使用“删除级联”创建表。我想知道为什么没有发生这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2013-08-06
  • 2011-03-31
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多