繁体   English   中英

Django can't drop database: psycopg2.OperationalError: cannot drop the current open database

[英]Django can't drop database: psycopg2.OperationalError: cannot drop the currently open database

每当我尝试通过 manage.py 运行我的 Django 测试时,测试运行良好,但是最后当 Django 破坏数据库时,会发生以下错误:

Destroying test database for alias 'default'...
Traceback (most recent call last):
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
psycopg2.OperationalError: cannot drop the currently open database


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Applications/PyCharm.app/Contents/helpers/pycharm/django_test_manage.py", line 129, in <module>
    utility.execute()
  File "/Applications/PyCharm.app/Contents/helpers/pycharm/django_test_manage.py", line 104, in execute
    PycharmTestCommand().run_from_argv(self.argv)
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/core/management/commands/test.py", line 30, in run_from_argv
    super(Command, self).run_from_argv(argv)
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/core/management/base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/core/management/commands/test.py", line 74, in execute
    super(Command, self).execute(*args, **options)
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/core/management/base.py", line 399, in execute
    output = self.handle(*args, **options)
  File "/Applications/PyCharm.app/Contents/helpers/pycharm/django_test_manage.py", line 91, in handle
    failures = TestRunner(test_labels, verbosity=verbosity, interactive=interactive, failfast=failfast, keepdb='--keepdb' in sys.argv)
  File "/Applications/PyCharm.app/Contents/helpers/pycharm/django_test_runner.py", line 256, in run_tests
    extra_tests=extra_tests, **options)
  File "/Applications/PyCharm.app/Contents/helpers/pycharm/django_test_runner.py", line 156, in run_tests
    return super(DjangoTeamcityTestRunner, self).run_tests(test_labels, extra_tests, **kwargs)
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/test/runner.py", line 534, in run_tests
    self.teardown_databases(old_config)
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/test/runner.py", line 509, in teardown_databases
    connection.creation.destroy_test_db(old_name, self.verbosity, self.keepdb)
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/db/backends/base/creation.py", line 264, in destroy_test_db
    self._destroy_test_db(test_database_name, verbosity)
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/db/backends/base/creation.py", line 283, in _destroy_test_db
    % self.connection.ops.quote_name(test_database_name))
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/db/utils.py", line 95, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
django.db.utils.OperationalError: cannot drop the currently open database

我已经检查以确保没有其他任何东西连接到数据库 - 为什么 Django 不能删除数据库?

注意:我使用的是 PostgreSQL

TL; DR

如果您只是想要解决方案,请点击此处。 确保您的Postgres服务器具有“postgres”数据库。 您可以通过psql连接,运行/list/l 您可以通过在psql中运行CREATE DATABASE postgres来创建数据库。

扩展

Django更喜欢不从DATABASES设置中指定的“默认”数据库运行“初始化查询”(可能是创建测试数据库)。 这被认为是生产数据库,因此在Django的最佳利益是不要乱用它。

这就是为什么在测试开始时会显示(忽略我的文件系统):

    /Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/db/backends/postgresql/base.py:247: 
    RuntimeWarning: Normally Django will use a connection to the 'postgres' database to avoid running initialization queries against the production database when it's not needed 
    (for example, when running tests). Django was unable to create a connection to the 'postgres' database and will use the default database instead.
    RuntimeWarning

Django在DATABASES设置中指定的主机上查找名为“postgres”的DATABASES ,这是运行查询以创建和删除测试数据库的位置。 (注意:Django不需要在您的设置中明确指定“postgres”数据库,它只是在您的设置中指定的任何数据库服务器上查找它)。

看来如果这个“postgres”数据库不存在,Django可以创建测试数据库并运行测试,但它无法删除测试数据库。 这可能是因为Postgres不允许你删除你当前连接的数据库,但是对我来说似乎没有理由让Django不能将测试数据库从指定的“默认”(生产)数据库中删除设置。 我认为它使用“默认”数据库来创建测试数据库,因此似乎没有理由不能删除它。

无论如何,解决方案只是使用简单的SQL语句创建“postgres”数据库: CREATE DATABASE postgres 创建该数据库后,一切正常。

如果存在postgres数据库,请尝试在pg_hba.conf中添加对'postgres'数据库的访问权限。 参考: https//www.postgresql.org/docs/9.1/static/auth-pg-hba-conf.html

如果您将 pgbouncer 与 postgresql 一起使用,您可能希望将 postgres 数据库添加到 pgbouncer.ini 文件中的数据库列表中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM