Ошибка 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 пытается поиграть с управлением транзакциями, и вы получаете эту ошибку.