【发布时间】:2011-09-15 05:42:20
【问题描述】:
我使用 Postgres 进行生产和开发,但我想使用 sqlite 来运行一些测试。我没有看到一种简单的方法来配置一个引擎用于测试和另一个用于开发/生产。我错过了什么吗?
【问题讨论】:
-
现在,我正在使用这个解决方案,虽然它看起来非常糟糕:seanhayes.name/2010/01/09/test-database-django
标签: django django-testing
我使用 Postgres 进行生产和开发,但我想使用 sqlite 来运行一些测试。我没有看到一种简单的方法来配置一个引擎用于测试和另一个用于开发/生产。我错过了什么吗?
【问题讨论】:
标签: django django-testing
在您的设置中添加以下行:
import sys
if 'test' in sys.argv or 'test_coverage' in sys.argv: #Covers regular testing and django-coverage
DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'
确保您的实际数据库设置在他们之前。
【讨论】:
这不是一个直接的答案,但是是的,您错过了一个大问题 - 在 SQLite 上测试 Postgres 应用程序很棘手 - 它们如此不同。我建议您创建一个 ram-disk(例如使用tmpfs)并在那里创建您的 Postgres 测试数据库。它不会像 SQLite 那样快,但可能比存储在 HDD 上的常规 Postgres 数据库快一个数量级。
【讨论】:
您可以尝试类似于 Zachary Voase 建议的设置: http://blog.zacharyvoase.com/2010/02/03/django-project-conventions/
(整个帖子很有用,但请向下滚动到“设置”部分,了解此处最相关的部分。)
Zach 的策略是创建一个设置文件夹并使用__init__.py 文件将其标记为python 包。然后,您可以为每种部署类型创建一个单独的子模块,其结构如下:
settings/
|-- __init__.py # Empty; makes this a Python package
|-- common.py # All the common settings are defined here
|-- development.py # Settings for development
|-- production.py # Settings for production
|-- staging.py # Settings for staging
按照这个概念,您可以为 postgres 设置一个部署,为 sqlite 设置一个单独的部署,并根据需要分开每个配置。
【讨论】:
我最终在我的 settings.py 中添加了以下内容。 --keepdb 将在 RAM 中设置 Sqlite DB。
if 'test' in sys.argv:
for db_test in ['default']: # Add other DBs if needed
DATABASES[db_test]['ENGINE'] = 'django.db.backends.sqlite3'
if '--keepdb' in sys.argv:
DATABASES[db_test]['TEST']['NAME'] = '/dev/shm/' + db_test + '.test.db.sqlite3'
【讨论】: