Включить проверку целостности с помощью sqlite в django - PullRequest
9 голосов
/ 19 июля 2011

В моем проекте 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,)

Есть идеи?

Ответы [ 2 ]

17 голосов
/ 27 июля 2011

Итак, если наконец-то нашел правильный ответ. Все, что мне нужно было сделать, это добавить этот код в файл __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)
2 голосов
/ 26 июля 2011

Вы можете использовать сигналы 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...