假设我执行以下命令。
insert into hello (username) values ('me')
然后我就跑了
cursor.fetchall()
我收到以下错误
psycopg2.ProgrammingError: no results to fetch
如何在不检查查询是“插入”还是“选择”的情况下检测是否调用 fetchall() ?
谢谢。
看看这个属性:
cur.description
执行查询后,如果没有返回行,它将设置为 None,否则将包含数据 - 例如:
(Column(name='id', type_code=20, display_size=None, internal_size=8, precision=None, scale=None, null_ok=None),)
捕获异常并不理想,因为在某些情况下您可能会覆盖真正的异常。
检查cursor.pgresult_ptr是否为None。
cursor.execute(sql)
if cursor.pgresult_ptr is not None:
cursor.fetchall()
使用
cur.description
接受的答案不再解决问题。 cur.statusmessage
可以是一个解决方案。这将返回 SELECT 0
或 INSERT 0 1
。然后,简单的字符串操作可以帮助确定最后一个查询。
我发现的当前最佳解决方案是在
cursor.rowcount
之后使用 execute()
。如果 execute()
命令返回一个值,则该值将 > 0,否则将为 0。
我对这个问题的详细实用更新
sql = 'INSERT INTO public.loaders_log ("column" ) VALUES(%s ) RETURNING sid;'
cur.execute(sql, ('value',))
print('description', cur.description)
print('statusmessage', cur.statusmessage)
try:
print(cur.fetchone())
except Exception as ex:
print(ex)
conn.commit()
那个会输出
description (Column(name='sid', type_code=23),)
statusmessage INSERT 0 1
(5,)
以下代码为您提供了
description
属性的全貌
sql = 'INSERT INTO public.loaders_log ("name" ) VALUES(%s ) ;'
cur.execute(sql, ('params',))
print('description', cur.description)
print('statusmessage', cur.statusmessage)
try:
print(cur.fetchone())
except Exception as ex:
print(ex)
conn.commit()
打印:
description None
statusmessage INSERT 0 1
no results to fetch
问题在于,cur.fetchone() 的结果是 None 所以停止循环的方法是:
cursor.execute("SELECT * from rep_usd")
output = cursor.fetchone()
while output is not None:
print(output)
output = DBCursor.fetchone()
cursor.description 永远不会是 None!