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

时间:2016-08-17 14:16:10

标签: python django postgresql postgis

我在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.

所以,根据This post,我运行:

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',
    }
}

4 个答案:

答案 0 :(得分:5)

sudo /etc/init.d/postgresql restart可能会重启将解决此问题

答案 1 :(得分:1)

我发现CHUCKCMARTIN移植了一个有用的答案here

总结起来,您需要运行以下代码以使其再次可用。

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])

答案 2 :(得分:0)

详细信息:使用数据库还有另外一个会话。

在pg admin ui中打开测试数据库并尝试同时运行django测试时看到此消息。在删除db django / psycopg2之前,检查该数据库上是否有活动的会话。在pg admin中关闭与服务器的连接,它就可以了。检查您是否在shell或ui中连接到db。不需要重启服务器。

答案 3 :(得分:0)

在终端中,运行:

interface Variables { uuid: string; value: string; } const { mutate: myMutation } = useMutation(myGqlMutation);

这将输出使用postgres运行的不同进程,例如:

myMutation({ uuid: '....', value: '....', } as any); // get rid of any here ...

找到运行ps aux | grep postgres的进程以及该进程的对应ID,在本示例中为my_user 5983 0.0 0.0 7325299 4583 ?? Ss 3:15PM 0:00.02 postgres: my_user test_myproj [local] idle。通过运行以下命令终止该过程:

test_myproj