【问题标题】:Django Testing MySQLdb in UnitTest / WebTestDjango 在 UnitTest / WebTest 中测试 MySQLdb
【发布时间】:2013-08-26 17:39:49
【问题描述】:

我有一个 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 运行代码,也会发生同样的事情。有什么想法吗?

【问题讨论】:

  • 一般来说,在生产、开发和测试中使用不同的数据库后端并不是一个好主意。您正在尝试将MySQLdb 与 sqlite3 一起使用 - 难怪它不起作用。
  • 多哈。嘿,今天是星期一,对吧?

标签: python django mysql-python django-unittest django-webtest


【解决方案1】:

正如 alecxe 在 cmets 中指出的那样,您不能将 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';")
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2016-08-29
    • 2015-09-20
    • 2014-07-26
    相关资源
    最近更新 更多