如何在 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 中使用不同的数据库引擎进行测试和生产的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中使用不同的设置进行单元测试?

在使用 ORM 的 Django 中,如何对不同的值进行多个自连接

使用haystack实现Django的全文搜索 -- Elasticsearch搜索引擎

如何在谷歌应用引擎上将帖子从数据库异步加载到 django 模板?

如何在 Django 1.8 中使用 jinja2 作为模板引擎

如何使用 QuerySets 和 MySql“全文搜索”在多个字段中进行 Django 搜索?