2013-08-26 86 views
0

我有我使用的Django WebTest的針對內存數據庫運行WebTest的。Django的測試MySQLdb的在單元測試/ 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運行代碼,也會發生同樣的情況。有任何想法嗎?

+1

一般來說,它不是用於生產,開發和測試不同的數據庫後端是一個好主意。你正試圖在sqlite3中使用'MySQLdb' - 難怪它不起作用。 – alecxe

+0

Doh。嘿,這是星期一吧? – scoopseven

回答

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';") 
...