假设我们有以下代码(在带有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建立新的连接?
答案 0 :(得分:2)
在重新获得光标之前关闭连接。 Django将尝试重新连接到DB:
try:
...
except OperationalError:
connection.close()
cursor = connection.cursor()