确保psycopg2数据库连接活着
-
16-09-2019 - |
题
我有打开,可以为一个小时挂在线数据库连接Python应用程序,但有时数据库服务器重新启动,而Python仍然有它不会与OperationalError
异常工作的连接。
所以我在寻找任何可靠的方法,以“平”的数据库,并知道连接活着。我查了psycopg2文档,但无法找到这样的事情。当然,我可以发出像SELECT 1
一些简单的SQL语句并捕获异常,但我希望有一个本地方法,像PHP的 pg_connection_status
感谢。
解决方案
pg_connection_status
使用PQstatus实现。 psycopg不公开该API,所以检查是不可用的。只有两个地方psycopg调用PQstatus本身是当一个新的连接时,在执行的开始。所以,是的,你将需要发出一个简单的SQL语句找出连接是否仍然存在。
其他提示
这问题确实是老了,但还是弹出在谷歌搜索,所以我认为这是有价值知道psycopg2.connection
实例现在拥有的当连接是打开该closed
属性将被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_level
。这将引发一个OperationalError在案件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")
不隶属于 StackOverflow