检测是否从psycopg2游标中获取?

问题描述 投票:0回答:6

假设我执行以下命令。

insert into hello (username) values ('me')

然后我就跑了

cursor.fetchall()

我收到以下错误

psycopg2.ProgrammingError: no results to fetch

如何在不检查查询是“插入”还是“选择”的情况下检测是否调用 fetchall() ?

谢谢。

python psycopg2
6个回答
34
投票

看看这个属性:

cur.description

执行查询后,如果没有返回行,它将设置为 None,否则将包含数据 - 例如:

(Column(name='id', type_code=20, display_size=None, internal_size=8, precision=None, scale=None, null_ok=None),)

捕获异常并不理想,因为在某些情况下您可能会覆盖真正的异常。


4
投票

检查cursor.pgresult_ptr是否为None。

cursor.execute(sql)
if cursor.pgresult_ptr is not None:
    cursor.fetchall()

3
投票

使用

cur.description
接受的答案不再解决问题。
cur.statusmessage
可以是一个解决方案。这将返回
SELECT 0
INSERT 0 1
。然后,简单的字符串操作可以帮助确定最后一个查询。


0
投票

我发现的当前最佳解决方案是在

cursor.rowcount
之后使用
execute()
。如果
execute()
命令返回一个值,则该值将 > 0,否则将为 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

-1
投票

问题在于,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!

© www.soinside.com 2019 - 2024. All rights reserved.