Django测试--无法删除和重新创建测试数据库。

15

我正在 Mac OS X 上运行 Django 1.9、Postgres 9.5.1。

当我运行 /manage.py test --settings=myproj.settings.local 时,会得到以下结果:

Creating test database for alias 'default'...
Creating test database for alias 'userlocation'...
Got an error creating the test database: database "test_myproj" already exists

Type 'yes' if you would like to try deleting the test database 'test_myproj', or 'no' to cancel: yes
Destroying old test database for alias 'userlocation'...
Got an error recreating the test database: database "test_myproj" is being accessed by other users
DETAIL:  There is 1 other session using the database.

所以,根据这篇文章,我运行:

SELECT 
    pg_terminate_backend(pid) 
FROM 
    pg_stat_activity 
WHERE 

    pid <> pg_backend_pid()

    AND datname = 'test_myproj'
    ;

尝试运行测试并进行DROP DATABASE test_myproj,结果出现错误DETAIL: There is 1 other session using the database.

查看进程列表后,没有任何与数据库相关的内容。我杀掉服务器并重新启动,但运行测试的管理命令仍然报告有另一个会话连接到数据库。

这真是个难题,我以前从未遇到过这种情况--有其他人遇到过吗?

我的设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproj',
        'USER': 'myuser',
        'PASSWORD': 'mypass',
        'HOST': 'localhost',
        'PORT': '',
    },
    'userlocation': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'og_myproj',
        'USER': 'og_myuser',
        'PASSWORD': 'mypasswd',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

我没有解决方案,但你的问题似乎是,在测试情况下两个数据库都被命名为test_myproj - 对于默认情况下它可以工作,然后对于用户位置,这个数据库被检测为已存在。现有的会话是当前运行测试的Django仍在使用的会话。当脚本死亡后就没有会话了 ;) - dahrens
1
请看这些文档 - dahrens
@dahrens,谢谢。调整了一下设置文件,现在完美运行。 - fiacre
5个回答

8

sudo /etc/init.d/postgresql restart 可能会解决这个问题,尝试重新启动一下。


我正在使用Mac,执行$ pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log restart后,运行./manage.py test --settings=ohmgear.settings.local --no-input会出现相同的错误:Destrying old test database for alias 'userlocation'...无法重新创建测试数据库,错误信息为: 数据库“test_og_myproj”不存在。 - fiacre
我关闭了服务器并重新启动,但运行测试的管理命令仍然给出错误提示,称有另一个会话连接到数据库。-- 我尝试过这个。 - fiacre
1
@cs_stackX 告诉我们“这不是正确的答案”并没有什么帮助。这对我来说看起来像是一个变通方法,但至少它修正了问题。如果你有更持久的解决方案,请发帖分享,这将非常有帮助! - MikeyE

5
在终端中,运行以下命令:
``` ps aux | grep postgres ```
这将输出使用postgres运行的不同进程,例如:
``` my_user 5983 0.0 0.0 7325299 4583 ?? Ss 3:15PM 0:00.02 postgres: my_user test_myproj [local] idle ```
找到运行着test_myproj的进程以及该进程的ID,例如在这个例子中是5983。通过运行以下命令来结束该进程:
``` kill -9 5983 ```

4

我在这里找到了一个有用的答案,由CHUCKCMARTIN移植而来:这里

总之,你需要运行此代码才能再次使用。

from django.core.management.base import BaseCommand
from django.db import connection
from django.conf import settings
cursor = connection.cursor()
database_name = 'test_<FAILING_DB_NAME>'
cursor.execute(
    "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity "
    "WHERE pg_stat_activity.datname = %s AND pid <> pg_backend_pid();", [database_name])

0

有1个其他会话正在使用数据库。

在pg admin ui中打开测试数据库并尝试同时运行django测试时,看到了这条消息。在删除数据库之前,django/psycopg2会检查是否有任何活动会话。在pg admin中关闭与服务器的连接,问题就解决了。在shell或ui中检查是否有与数据库的连接。不应该需要重新启动服务器。


如果测试运行正常,但出现django.db.utils.OperationalError: cannot drop the currently open database,则Django需要连接到postgres数据库,并且需要在pg_hba.conf中定义。 - quiet_penguin

0

我在尝试从Pycharm运行一些单元测试时遇到了同样的问题。如先前提到的,重新启动我的Postgres解决了我的问题。

如果有人正在使用Docker容器,则需要使用的命令是:

docker-compose restart postgresql-11

postgresql-11 是我的 PostgreSQL 数据库服务器名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接