Джанго Тестирование MySQLdb в UnitTest / WebTest
У меня есть WebTest, который я использую, используя django-webtest для базы данных в памяти.
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
}
}
Есть фрагмент кода, который я просто не могу запустить через ORM, он работает в 5 раз быстрее, чем прямой SQL. Да, я знаком с select_related, batch_select и prefetch_related. Вот как мой код SQL выполняется на мой взгляд.
db = MySQLdb.connect(host=settings.DATABASES['default']['HOST'],
user=settings.DATABASES['default']['USER'],
passwd=settings.DATABASES['default']['PASSWORD'],
db=settings.DATABASES['default']['NAME'])
cursor = db.cursor(MySQLdb.cursors.DictCursor)
cursor.execute("SELECT something FROM sometable WHERE somecondition = 'somevariable';")
count_queryset = cursor.fetchall()
cursor.close()
db.close()
Когда мой тестовый скрипт достигает этой точки в представлении, он заглушается следующей ошибкой:
File "/srv/reports/views.py", line 473, in my_view
db=settings.DATABASES['default']['NAME'])
File "build/bdist.macosx-10.8-x86_64/egg/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
File "build/bdist.macosx-10.8-x86_64/egg/MySQLdb/connections.py", line 187, in __init__
super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (1049, "Unknown database ':memory:'")
Я не уверен, почему база данных sqlite3 в памяти работает хорошо через ORM, но не когда я использую MySQLdb. То же самое происходит, если я запускаю код через unittest.TestCase, тоже. Есть идеи?
1 ответ
Как указывает alecxe в комментариях, вы не можете использовать соединения и курсоры MySQLdb с базой данных sqlite3. Вот мой быстрый и грязный обходной путь, который, вероятно, не подходит для любого кода, который вы собираетесь использовать в производстве. Я заменил строку подключения на эквивалент sqlite3:
import sqlite3
db = sqlite3.connect("settings.DATABASES['default']['HOST']")
cursor = db.cursor() # No direct equivalent to MySQLdb.cursors.DictCursor
cursor.execute("SELECT something FROM sometable WHERE somecondition = 'somevariable';")
...