从Django中的死数据库连接中恢复

时间:2015-02-25 13:57:51

标签: python django postgresql

假设我们有以下代码(在带有PostgreSQL后端的Django 1.6上测试):

from django.db import connection
from django.db.utils import OperationalError

cursor = connection.cursor()

try:
    # kill our own database connection
    cursor.execute('SELECT pg_terminate_backend(pg_backend_pid())');
except OperationalError:
    # Is it possible to get a fresh connection here?
    cursor = connection.cursor() # not useful
    # Will result in:
    # django.db.utils.InterfaceError: connection already closed
    cursor.execute('SELECT 1;')

显然,这段代码仅用于示例目的 - 在现实世界中,我并非故意终止我自己的连接,但我的连接可能会被数据库终止(OOM杀手,数据库管理员清理室,重新启​​动)整个数据库等)。有没有什么方法可以从现在终止的数据库连接中恢复,以某种方式迫使Django建立新的连接?

1 个答案:

答案 0 :(得分:2)

在重新获得光标之前关闭连接。 Django将尝试重新连接到DB:

try:
    ...
except OperationalError:
    connection.close()
    cursor = connection.cursor()