选择测试数据库?

mpe*_*pen 19 django postgresql webfaction django-testing

我想跑

./manage.py test
Run Code Online (Sandbox Code Playgroud)

但它告诉我

创建测试数据库时出错:拒绝创建数据库的权限

显然它没有创建数据库的权限,但我在共享服务器上,所以我无能为力.我可以通过控制面板创建一个新的数据库,但我认为没有办法让Django自动完成.

那么,我不能手动创建测试数据库,而是告诉Django每次都刷新它,而不是重新创建整个东西?

Thi*_*lli 14

我有类似的问题.但我希望Django绕过为我的一个实例创建一个测试数据库(这不是一个很难的镜像).按照Mark的建议,我创建了一个自定义测试运行器,如下所示

from django.test.simple import DjangoTestSuiteRunner


class ByPassableDBDjangoTestSuiteRunner(DjangoTestSuiteRunner):

    def setup_databases(self, **kwargs):
        from django.db import connections
        old_names = []
        mirrors = []

        for alias in connections:
            connection = connections[alias]
            # If the database is a test mirror, redirect its connection
            # instead of creating a test database.
            if connection.settings_dict['TEST_MIRROR']:
                mirrors.append((alias, connection))
                mirror_alias = connection.settings_dict['TEST_MIRROR']
                connections._connections[alias] = connections[mirror_alias]
            elif connection.settings_dict.get('BYPASS_CREATION','no') == 'no':
                old_names.append((connection, connection.settings_dict['NAME']))
                connection.creation.create_test_db(self.verbosity, autoclobber=not self.interactive)
        return old_names, mirrors
Run Code Online (Sandbox Code Playgroud)

然后我在settings.py中的一个数据库条目中创建了一个额外的dict条目, 'BYPASS_CREATION':'yes',

最后,我配置了一个新的TestRunner

TEST_RUNNER = 'auth.data.runner.ByPassableDBDjangoTestSuiteRunner'
Run Code Online (Sandbox Code Playgroud)

  • 旧线程,但对于任何寻求答案的人...都受本文启发,这是django 1.8的测试运行器,它添加了一个设置,允许您指定要用于测试的数据库。https://djangosnippets.org/snippets/10544/ (2认同)

Mic*_*tra 8

我建议使用sqlite3进行测试,同时继续使用mysql/postgres/etc进行生产.

这可以通过将其放在您的设置文件中来实现:

if 'test' in sys.argv:
    DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}
Run Code Online (Sandbox Code Playgroud)

请参阅使用sqlite运行django测试

将在您的django项目主目录中创建一个临时sqlite数据库文件,您将具有写入权限.另一个优点是sqlite3的测试速度更快.但是,如果你使用任何mysql/postgres特定的原始sql(你应该尽量避免使用它),你可能会遇到问题.

  • 它确实创建了更快的速度,但是当数据超过max_length时,你确实遇到了没有错误的问题.太经常咬我了.所有测试都会通过,但回到postgresql它会失败.还建议使用''default':{'ENGINE':'django.db.backends.sqlite3','NAME':':memory:'}` (7认同)
  • 但是sqlite3和postgres的行为大不相同!您将看到无法在开发中测试的仅生产错误。 (2认同)