Python 确保psycopg2数据库连接处于活动状态

Python 确保psycopg2数据库连接处于活动状态,python,database,connection,psycopg2,Python,Database,Connection,Psycopg2,我有一个python应用程序,它可以打开一个数据库连接,这个数据库连接可以在线挂起几个小时,但有时数据库服务器会重新启动,而python仍然有这个连接,它将无法处理OperationalErrorexception 因此,我正在寻找任何可靠的方法来“ping”数据库,并知道连接是活动的。我查阅了psycopg2文档,但找不到类似的内容。当然,我可以发出一些简单的SQL语句,比如select1并捕获异常,但我希望有一个本地方法,比如PHP 谢谢。pg\u连接状态使用PQstatus实现。psyco

我有一个python应用程序,它可以打开一个数据库连接,这个数据库连接可以在线挂起几个小时,但有时数据库服务器会重新启动,而python仍然有这个连接,它将无法处理
OperationalError
exception

因此,我正在寻找任何可靠的方法来“ping”数据库,并知道连接是活动的。我查阅了psycopg2文档,但找不到类似的内容。当然,我可以发出一些简单的SQL语句,比如
select1
并捕获异常,但我希望有一个本地方法,比如PHP


谢谢。

pg\u连接状态
使用PQstatus实现。psycopg不公开该API,因此检查不可用。psycopg调用PQstatus本身的唯一两个位置是建立新连接时和执行开始时。因此,是的,您需要发出一个简单的SQL语句来确定连接是否仍然存在。

这个问题确实很老,但仍然会在Google搜索中弹出,因此我认为有必要知道,
psycopg2.connection
实例现在有一个值,当连接打开时,该值将为
0
,并且在连接关闭时大于零。以下示例应说明:

import psycopg2
import subprocess

connection = psycopg2.connect(
    dbname=database,
    user=username,
    password=password,
    host=host,
    port=port
)

print connection.closed # 0

# restart the db externally
subprocess.check_call("sudo /etc/init.d/postgresql restart", shell=True)

# this query will fail because the db is no longer connected
try:
    cur = connection.cursor()
    cur.execute('SELECT 1')
except psycopg2.OperationalError:
    pass

print connection.closed # 2

connection.closed
不反映服务器关闭/断开的连接。它仅表示客户端使用
connection.close()关闭的连接

为了确保连接仍然有效,请阅读属性
connection.isolation\u level
。如果连接断开,这将引发pgcode==“57P01”的操作错误

这为数据库的往返增加了一点延迟,但应该比
SELECT 1
或类似选项更可取

import psycopg2
dsn = "dbname=postgres"
conn = psycopg2.connect(dsn)

# ... some time elapses, e.g. connection within a connection pool

try:
    connection.isolation_level
except OperationalError as oe:
    conn = psycopg2.connect(dsn)

c = conn.cursor()
c.execute("SELECT 1")

如何检查连接是否关闭:

  • 如果已关闭,则conn.closed为1,否则为0

  • 如果关闭,它将引发除psycopg2.InterfaceError as exc:
之外的
,不仅在查询中,而且在上下文管理器中:
和conn:
足以引发

  • 然后需要重新建立连接。例如,读取pw并放入
    。连接(..)


  • 我在阅读psycopg2资料时得出了相同的结论。谢谢。将向psycopg作者提交添加此类功能的请求。请参阅以下Jaymon的回答。使用psycopg2.5.2和psql 8.4进行测试-无论发生什么情况,隔离级别始终为零。您是否尝试过终止数据库连接TCP句柄(在Windows上)<代码>连接。关闭
    很遗憾,不会更改值。@Vyktor你说得对!问题是,Python的连接在尝试与db通信之前并不知道它已被切断。我已经更新了示例。好消息是,您可以包装查询执行代码以检查出错时的连接,并根据需要重新连接。我的连接在查询过程中关闭,因为数据库重新启动,
    cur.execute('SELECT 1'))
    在我的情况下抛出了一个
    接口错误
    ,消息
    光标已关闭
    连接。关闭2表示?@SmartManoj看着屏幕,它看起来像2表示发生了可怕的事情