【问题标题】:How to use different database engines in Django for testing and production如何在 Django 中使用不同的数据库引擎进行测试和生产
【发布时间】: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",
    }
}

【问题讨论】:

    标签: python mysql django sqlite django-testing


    【解决方案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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-19
            • 2011-06-06
            • 2020-06-19
            • 2018-09-12
            • 2022-08-02
            • 2010-12-11
            • 2019-02-13
            • 1970-01-01
            相关资源
            最近更新 更多