如何在Django中使用不同的数据库引擎进行测试和生产

use*_*027 5 python mysql sqlite django django-testing

我是Django的新手.我在项目中有一个应用程序,它是用测试驱动开发开发的.在生产中我们使用MySQL作为数据库引擎,但是如果我用MySQL运行测试:

./manage test myapp
Run Code Online (Sandbox Code Playgroud)

然后它吸收了太多的时间(2-4分钟)来创建数据库,尽管测试速度非常快(大约一秒钟).

如果我使用SQLite,那么测试只需要几秒钟,这对我来说是完美的.但问题是我经常需要在MySQL上使用我的本地数据库的管理界面.

如何让django在sqlite上运行测试并使用mysql启动runserver?

现在我在settings/local.py中使用这些设置,但我应该注释/取消注释行以根据我目前的活动来更改数据库.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',  # Use for testing
        'NAME': 'databasename.db3',
        # 'ENGINE': 'django.db.backends.mysql',  # Use if need admin on localserver
        # 'NAME': 'databasename',              
        'USER': 'myuser',                      # Not used with sqlite3.
        'PASSWORD': 'somepassword',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
        'TEST_CHARSET': "utf8",         #option to make tesing database with utf8
        'TEST_COLLATION': "utf8_general_ci",
    }
}
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 7

一种选择是检查sys.argv以下test参数settings.py:

if 'test' in sys.argv:
    DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'
    DATABASES['default']['NAME'] = 'databasename.db3'
Run Code Online (Sandbox Code Playgroud)

但是,作为旁注:严格来说,为测试和开发/阶段/生产提供不同的数据库后端并不是一个好主意.您可能会遇到特定于数据库的 "特殊"情况,这可能会花费您大量时间和头痛.


小智 6

你不需要做任何黑客。“--settings” - 这就是你要找的。

python manage.py test APP --settings settings.local
python manage.py test APP --settings settings.production
Run Code Online (Sandbox Code Playgroud)