如何在 Django 中使用不同的数据库引擎进行测试和生产
Posted
技术标签:
【中文标题】如何在 Django 中使用不同的数据库引擎进行测试和生产【英文标题】:How to use different database engines in Django for testing and production 【发布时间】:2014-07-17 20:39:06 【问题描述】:我是 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",
【问题讨论】:
【参考方案1】:一种选择是检查sys.argv
中的test
参数settings.py
:
if 'test' in sys.argv:
DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'
DATABASES['default']['NAME'] = 'databasename.db3'
不过,附带说明一下:严格来说,为测试和开发/阶段/生产使用不同的数据库后端并不是一个好主意。您可能会遇到database-specific“特殊”情况,这会花费您大量时间和头痛。
【讨论】:
【参考方案2】:尽可能在生产和测试中使用相同的设置总是一个好主意。它有助于更好的测试。我处理运行缓慢的测试的好方法是使用django-nose。它允许您重用以前创建的测试数据库。这可以超级加速测试运行。查看文档中的enabling database reuse。一个例子如下:
REUSE_DB=1 ./manage.py test
【讨论】:
【参考方案3】:通常我使用以下架构:
为不同的模式创建两个设置文件
touch settings/production.py
touch settings/testing.py
生产模式
ln -s settings/production.py settings/__init__.py
测试模式
ln -s settings/testing.py settings/__init__.py
【讨论】:
【参考方案4】:您无需进行任何修改。 “--settings”——这就是你要找的。p>
python manage.py test APP --settings settings.local
python manage.py test APP --settings settings.production
【讨论】:
以上是关于如何在 Django 中使用不同的数据库引擎进行测试和生产的主要内容,如果未能解决你的问题,请参考以下文章
在使用 ORM 的 Django 中,如何对不同的值进行多个自连接
使用haystack实现Django的全文搜索 -- Elasticsearch搜索引擎
如何在谷歌应用引擎上将帖子从数据库异步加载到 django 模板?