我正在尝试将一些psycopg2代码更新到psycopg3。我尝试基于从Python传递的一组值进行选择(与现有表连接)。如果没有join,一个简单的例子是:
with connection.cursor() as cur:
sql = "WITH sources (a,b,c) AS (VALUES %s) SELECT a,b+c FROM sources;"
data = (('hi',2,0), ('ho',5,2))
cur.execute(sql, (data,) )
print(cur.fetchone());
字符串
我得到一个错误
ProgrammingError: syntax error at or near "'("(hi,2,0)","(ho,5,2)")'"
LINE 1: WITH sources (a,b,c) AS (VALUES '("(hi,2,0)","(ho,5,2)")') S...
型
psycopg2代码使用了extras.execute_values
,这在psycopg3中不可用。
有没有一种方法可以使用psycopg3传递中间表的值?
1条答案
按热度按时间yfwxisqw1#
有一种方法:
字符串
psycopg cursor classes:
executemmany(.)
注记
使用通常的fetchone()、fetchall(),您将能够读取仅由执行的第一个查询返回的记录。为了读取以下查询的结果,您可以调用nextset()来移动到以下结果集。
executemmany(returning=True)的一个典型用例可能是插入一堆记录并检索插入的主键,这些主键取自PostgreSQL序列。为此,您可以执行一个查询,例如INSERT INTO table VALUES(...)RETURNING id。因为每个INSERT都保证插入一条记录,所以可以使用以下模式获得新id的列表:
型
警告
更明确地说,fetchall()本身不会返回所有返回的值!必须使用nextset()迭代结果。
更新
型
使用
sql.Composed
构建了一个带有可变数量的VALUES
和占位符的查询。将元组的元组组合成一个平面列表并将其传递给查询。