我有一个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运行代码也会发生同样的事情。有什么想法吗?
答案 0 :(得分:0)
正如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';")
...