Har*_*ons 32 python database connection psycopg2
我有一个python应用程序打开一个数据库连接,可以在线挂起一个小时,但有时数据库服务器重新启动,而python仍然有连接它将无法正常工作OperationalError.
所以我正在寻找任何可靠的方法来"ping"数据库,并知道连接是活的.我检查了一个psycopg2文档,但找不到那样的东西.当然我可以发出一些简单的SQL语句SELECT 1并捕获异常,但我希望有一个本机方法,比如PHP pg_connection_status
谢谢.
Jay*_*mon 47
这个问题确实很旧,但仍会在Google搜索中弹出,所以我认为知道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
Run Code Online (Sandbox Code Playgroud)
Mar*_*wis 13
pg_connection_status是使用PQstatus实现的.psycopg不公开该API,因此检查不可用.psycopg调用PQstatus本身的唯一两个地方是在建立新连接时,以及在执行开始时.所以,是的,您需要发出一个简单的SQL语句来确定连接是否仍然存在.
小智 7
connection.closed不反映服务器关闭/切断的连接.它仅表示客户端使用关闭的连接connection.close()
为了确保连接仍然有效,请阅读该属性connection.isolation_level.如果连接失效,这将引发一个带有pgcode =="57P01"的OperationalError.
这为往返数据库增加了一点延迟,但应优于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")
Run Code Online (Sandbox Code Playgroud)
如何检查连接是否关闭:
conn.close 如果关闭则为 1,否则为 0
如果关闭,它except psycopg2.InterfaceError as exc:不仅会在查询时引发,还会在上下文管理器中引发:with conn:足以引发。
然后您需要重新建立连接。例如读出密码并放入.connect(..)
| 归档时间: |
|
| 查看次数: |
25906 次 |
| 最近记录: |