postgresql 插入返回“最后一个操作没有产生结果”

xqk2d5yq  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(3)|浏览(143)

对于以下代码:

with psycopg.connect(host="host_name", dbname="db_name", user="user", password="pass") as conn:
  with conn.cursor() as cur:
    cur.execute("SELECT * FROM table_name")
    res = cur.fetchall()
    print(res)

一切正常,但如果我尝试通过替换

cur.execute("SELECT * FROM table_name")

cur.execute("INSERT INTO table_name (column_1, column_2) VALUES (%s, %s)", ("a","b"))

我得到以下错误“上次操作没有产生结果”是什么原因造成的?

htzpubme

htzpubme1#

有两种方法来处理这个问题:

import psycopg2
con = psycopg2.connect(database="test", host='localhost', user='postgres')
cur = con.cursor()
cur.execute("insert into animals values(24, 'fair', 'cat')")
cur.rowcount
1

cur.execute("insert into animals values(34, 'good', 'dog') returning id")
cur.fetchone()
(34,)

第一种方法返回每个Cursor受操作影响的行数。
第二种方法返回id字段,因此实际上有一个结果。

jobtbby3

jobtbby32#

在插入操作的情况下,res = cur.fetchall()是冗余的。这里的错误代码是不言自明的。

try:
    cur.execute("INSERT INTO table_name (column_1, column_2) VALUES (%s, %s)", ("a","b"))
except:
    print('error')
n3h0vuf2

n3h0vuf23#

游标是可迭代的对象,因此,如果您有多个执行操作产生多个结果,则在使用结果时应迭代Cursor对象,如下所示:for record in cursor:,而不是一次,这将抛出异常。您还可以在每个结果执行操作之后进行消费,例如cur.fetchone()cur.commit()

相关问题