对于以下代码:
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"))
我得到以下错误"最后一次操作没有产生结果"是什么引起的?
有两种处理方法:
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
字段,因此实际上有一个结果。
对于插入操作,res = cur.fetchall()
是冗余的。这里的错误代码是不言自明的。
try:
cur.execute("INSERT INTO table_name (column_1, column_2) VALUES (%s, %s)", ("a","b"))
except:
print('error')
游标是可迭代的对象,所以,如果你有多个产生多个结果的执行操作,你应该在消费结果时遍历游标对象,像这样:for record in cursor:
,而不仅仅是一次,这将抛出一个异常。您还可以在每次结果执行操作之后消费,例如cur.fetchone()
和cur.commit()
在每次无结果执行之后消费。