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

Python 如何在Django中使用不同的数据库引擎进行测试和生产,python,mysql,django,sqlite,django-testing,Python,Mysql,Django,Sqlite,Django Testing,我在Django是个新手。我在项目中有一个应用程序,它是通过测试驱动开发开发的。在生产中,我们使用MySQL作为数据库引擎,但如果我使用MySQL运行测试: ./manage test myapp 然后创建数据库会占用太多的时间(2-4分钟),尽管测试相当快(大约一秒钟) 如果我使用SQLite,那么测试只需要几秒钟,这对我来说是完美的。但问题是,我经常需要MySQL上本地数据库的管理接口 如何让django在sqlite上运行测试并使用mysql启动runserver 现在,我在settin

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

./manage test myapp
然后创建数据库会占用太多的时间(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",
    }
}

一个选项是在
settings.py
中检查
test
参数:

if 'test' in sys.argv:
    DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'
    DATABASES['default']['NAME'] = 'databasename.db3'

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

只要可能,在生产和测试中使用相同的设置总是一个好主意。这有利于更好的测试。我认为处理缓慢运行的测试的一个好方法是使用。它允许您重用以前创建的测试数据库。这可以超级加速测试运行。在文档中签出。例如:

REUSE_DB=1 ./manage.py test

通常我使用以下模式:

为不同模式创建两个设置文件

touch settings/production.py
touch settings/testing.py
论生产方式

ln -s settings/production.py settings/__init__.py
论测试模式

ln -s settings/testing.py settings/__init__.py

你不需要做任何黑客。“--设置”-这就是您要查找的内容

python manage.py test APP --settings settings.local
python manage.py test APP --settings settings.production