使用psycopg执行INSERT报错“the last operation didn't produce a result”的原因
错误触发原因
你替换INSERT语句后没有删除原有适配SELECT查询的fetchall()调用,是触发该错误的核心原因:
- 只有执行带结果集返回的SQL语句(比如SELECT、带RETURNING子句的INSERT/UPDATE/DELETE)后,才能调用
cur.fetchall()、cur.fetchone()这类游标取数方法 - 普通无RETURNING子句的INSERT属于写操作,执行后不会产生查询结果集,此时调用取数方法就会抛出该错误
修复方案
根据你的业务需求选一种即可:
- 不需要获取插入返回数据的场景,直接删除原代码中
res = cur.fetchall()和print(res)两行即可,INSERT执行无报错就默认操作生效,psycopg的连接上下文管理器会在无异常时自动提交事务。
修改后可运行的代码示例:
with psycopg.connect(host="host_name", dbname="db_name", user="user", password="pass") as conn: with conn.cursor() as cur: cur.execute("INSERT INTO table_name (column_1, column_2) VALUES (%s, %s)", ("a","b"))
- 需要获取插入后返回数据(比如自增主键ID、生成的字段值)的场景,给INSERT语句加上
RETURNING子句指定要返回的字段即可保留取数逻辑:
with psycopg.connect(host="host_name", dbname="db_name", user="user", password="pass") as conn: with conn.cursor() as cur: # 示例返回插入行的id字段,可替换为你需要的字段名或*返回整行 cur.execute("INSERT INTO table_name (column_1, column_2) VALUES (%s, %s) RETURNING id", ("a","b")) res = cur.fetchall() print(res)
内容的提问来源于stack exchange,提问作者gbox
相关产品推荐
相关产品推荐

