10

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

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

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

PRAGMA foreign_keys = 1;

但是,我不知道进行此激活的最佳方式在哪里(同样的问题在这里)。

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

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,)

有任何想法吗?

4

2 回答 2

18

所以,如果终于找到了正确答案。我所要做的就是将此代码添加到__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)
于 2011-07-27T10:53:29.787 回答
2

您可以使用 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”中检查您使用的数据库。

于 2011-07-26T18:52:39.237 回答