Ошибка django-admin.py sqlflush во время тестов

У меня есть набор тестов в моем приложении Django, которые раньше проходили, но в какой-то момент эволюции программного обеспечения я начал получать такие сообщения, когда запускаю тесты:

Ошибка: база данных test_totomanager_demo не может быть сброшена. Возможные причины:
* База данных не работает или настроена неправильно.
* По крайней мере одна из ожидаемых таблиц базы данных не существует.
* SQL был недействительным.
Подсказка: посмотрите на вывод django-admin.py sqlflush. Это SQL, который эта команда не смогла выполнить.
Полная ошибка: (1105, "MyISAM-таблица" video_videoinstallation "используется (скорее всего, таблицей MERGE). Попробуйте FLUSH TABLES.")

База данных MySQL.

Точный тест, в котором эта ошибка начинает возникать, непредсказуем. Это не первый раз, когда это происходит, но после одной или двух попыток, которые раньше проходили, на этот раз я не могу довести тесты до конца.

Любой намек на то, как этого избежать?

3 ответа

Я сам столкнулся с этой проблемой и понял, что это потому, что я еще не создал миграцию для изменения модели.

Пытаться:

./manage.py schemamigration <your_app_name> --auto

У меня установлена ​​южная миграция в этом virtualenv, так что это, вероятно, требование, если вы не хотите писать миграцию самостоятельно.

Вероятно, это потому, что ваш тип таблицы - MyISAM, который блокирует всю таблицу. Если вам не нужен "ПОЛНЫЙ ТЕКСТОВЫЙ ПОИСК" в этой таблице, то вы должны сделать ее таблицей innodb.

Я не знаю, как работают тесты django, но одно из возможных решений - запускать по одному тесту за раз, а не запускать их все сразу, чтобы избежать тестирования, пока таблица заблокирована.

Используйте класс Python TestCase вместо Django.

Replace

from django.test import TestCase
class TestChrono(TestCase):

with

import unittest
class TestChrono(unittest.TestCase):

Это обходное решение, но оно определенно не повлияет на ваш тестовый пример, если вы не используете приборы. Django Testcase пытается поиграть с управлением транзакциями, и вы получаете эту ошибку.

Другие вопросы по тегам