Джанго Тестирование 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';")
...
Другие вопросы по тегам