gpt4 book ai didi

postgresql - 如何使用psycopg2的异步特性?

转载 作者:行者123 更新时间:2023-11-29 12:10:27 24 4
gpt4 key购买 nike

我正在尝试对不同的表执行 3 个不同的 postgresql 查询。每个查询需要 2 秒来执行。我想知道是否可以同时运行所有 3 个查询,这样我可以节省 4 秒。我尝试使用 pyscopg2 的异步功能,但它只返回上次查询的结果。谁能指出我做错了什么?

import select
import psycopg2
import psycopg2.extensions

def wait(conn):
while 1:
state = conn.poll()
if state == psycopg2.extensions.POLL_OK:
break
elif state == psycopg2.extensions.POLL_WRITE:
select.select([], [conn.fileno()], [])
elif state == psycopg2.extensions.POLL_READ:
select.select([conn.fileno()], [], [])
else:
raise psycopg2.OperationalError("poll() returned %s" % state)


aconn = psycopg2.connect(
dbname=pg_name,
user=pg_username,
host=pg_host,
password=pg_password,
async=1)

wait(aconn)
acurs = aconn.cursor()

acurs.execute(
"SELECT 1;"
"SELECT ST_Length(ST_GeomFromText"
"('LINESTRING(743238 2967416,743238 2967450)',4326));"
"SELECT 3;"
)
wait(acurs.connection)
result = acurs.fetchall()
print result

这只会打印:"result": [[3]]

最佳答案

根据 Psycopg Introduction :

[Psycopg] is a wrapper for the libpq, the official PostgreSQL client library.

然后,查看libpq documentation对于 PQexec()(用于将 SQL 查询发送到 PostgreSQL 数据库的函数),我们看到以下注释(强调我的):

Multiple queries sent in a single PQexec call are processed in a single transaction, unless there are explicit BEGIN/COMMIT commands included in the query string to divide it into multiple transactions. Note however that the returned PGresult structure describes only the result of the last command executed from the string.

因此,不幸的是,psycopg2libpq 根本不支持您尝试做的事情。 (但这并不是说 PostgreSQL 的其他客户端接口(interface)不支持它,但这超出了这个问题的范围。)

因此,为了回答您的问题,您做错的是在一个 execute() 调用中执行多个 SQL 查询,然后尝试检索它们的所有结果,事实上这是不可能的。您需要显式执行每个查询并单独检索结果,或者尝试寻找另一个支持一次返回多个结果集的 PostgreSQL API。


Python 数据库 API 2.0 规范允许可选的 nextset()由库实现的方法,它将 cursor 移动到从执行的查询返回的下一个结果集,但是这个方法没有在 psycopg2 中实现(原因很明显)和事实上,如果您尝试调用它(请参阅文档),则会引发 NotSupportedError 异常。

关于postgresql - 如何使用psycopg2的异步特性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38548239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com