执行Snowflake查询遇'NoneType'不可迭代错误,求解决方法
问题解决办法
问题根源
你每次调用con.cursor()都会生成一个全新的游标实例:第一个游标执行了SELECT语句,但后续遍历和打印操作用的都是未执行过查询的新游标,这些新游标没有结果集,调用fetchall()会返回None,从而触发'NoneType' object is not iterable错误。
解决办法
方案1:复用游标+预存结果集
创建单个游标并复用,先把查询结果存入变量,既可以用来打印,也能直接转为Python列表:
con = snowflake.connector.connect( user='PYTHON_SNOWFLAKE', account='aa', warehouse='aa', database='aa', schema='test', ) try: # 创建单个游标并执行查询 cur = con.cursor() cur.execute('SELECT CONTENT_ID FROM table') # 一次性获取所有结果 results = cur.fetchall() # 打印每行的CONTENT_ID for row in results: print(row[0]) # 将数值存入Python列表 content_ids = [row[0] for row in results] print("Done", content_ids) finally: # 确保关闭游标和连接,避免资源泄漏 cur.close() con.close()
方案2:逐行读取并收集结果(适合大数据量)
如果查询结果数据量较大,不想一次性加载到内存,可以逐行读取,同时完成打印和列表存储:
con = snowflake.connector.connect( user='PYTHON_SNOWFLAKE', account='aa', warehouse='aa', database='aa', schema='test', ) try: cur = con.cursor() cur.execute('SELECT CONTENT_ID FROM table') content_ids = [] # 逐行遍历游标结果 for row in cur: print(row[0]) content_ids.append(row[0]) print("Done", content_ids) finally: cur.close() con.close()
关键注意事项
- 务必复用同一个游标对象,不要每次操作都调用
con.cursor()生成新游标 - 操作完成后必须关闭游标和数据库连接,建议用
finally块保证资源释放 - 游标结果集只能被遍历一次,若需要多次使用,提前将
fetchall()的结果存入变量
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

