繁体   English   中英

Django在UnitTest / WebTest中测试MySQLdb

[英]Django Testing MySQLdb in UnitTest / WebTest

我有一个WebTest,正在针对内存中的数据库使用django-webtest运行。

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
    }
}

我无法通过ORM运行一段代码,它的运行速度比直接SQL快5倍。 是的,我熟悉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运行代码,也会发生同样的事情。 有任何想法吗?

正如alecxe在评论中指出的那样,您不能在sqlite3数据库中使用MySQLdb连接和游标。 这是我的快速而肮脏的解决方法,它可能不适用于您将要在生产中使用的任何代码。 我将连接字符串替换为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';")
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM