这里的其他答案是;不幸的是,答案和原因如下。如果不首先调用fetch,就无法从服务器端游标中获取description 甚至rowcount。它根据PEP-249返回None:
对于不返回行的操作或游标尚未通过.execute*() 方法调用的操作,此属性将为None。
这是因为即使您调用了execute,服务器可能还没有执行查询,我们可以通过检查日志来确认(其中日志记录设置为all)
为了清楚起见,使用以下代码和 30 秒的睡眠
cursor = conn.cursor("server_side")
cursor.execute("select * from foo")
time.sleep(30)
cursor.fetchall()
print(cursor.description)
日志将显示
2020-06-19 12:11:37.687 BST [11916] LOG: statement: BEGIN
2020-06-19 12:11:37.687 BST [11916] LOG: statement: DECLARE "server_side" CURSOR WITHOUT HOLD FOR select * from foo
2020-06-19 12:12:07.693 BST [11916] LOG: statement: FETCH FORWARD ALL FROM "server_side"
注意声明和FETCH之间的30~秒间隔,后者是允许我们从光标中获取description的调用。
没有server_side比较
2020-06-19 12:11:01.310 BST [3012] LOG: statement: BEGIN
2020-06-19 12:11:01.311 BST [3012] LOG: statement: select * from foo
您唯一的选择是在更大的查询之前使用scroll 或执行LIMIT 1 选择。
一个不太吸引人的选择是像这样使用INFORMATION_SCHEMA 表
select column_name, data_type, character_maximum_length
from INFORMATION_SCHEMA.COLUMNS where table_name = 'foo';