You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:45:32