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

Python使用pandas.read_sql执行含INTO的SQL报NoneType不可迭代错误如何解决

问题根因

你代码中使用的SELECT ... INTO 语句的作用是将关联查询结果写入新的SQL表,SQL Server执行该语句后不会返回查询结果集,仅返回操作影响的行数。因此pd.read_sql()尝试解析返回的列结构时,拿到的游标描述为None,触发TypeError: 'NoneType' object is not iterable报错。

解决方案

场景1:需要将关联结果持久化存储到SQL新表后再读取

分两步执行:先完成建表写入操作,再单独查询新表数据加载到DataFrame:

import pypyodbc
import pandas as pd

SERVER_NAME ='DESKTOP-LBM9IMO\SQLEXPRESS'
DATABASE_NAME='721991dc-b510-40b2-ac5b-4d005a3cfd14'


conn = pypyodbc.connect("""
    Driver={{SQL Server Native Client 11.0}};
    Server={0};
    Database={1};
    Trusted_Connection=yes;""".format(SERVER_NAME, DATABASE_NAME)
    )

# 第一步:执行SELECT INTO完成新表创建和数据写入
create_table_query = """
SELECT [EventFrequency].[ResultID]
      ,[EventFrequency].[EventFrequency]
      ,[EventFrequency].[ImmediateIgnitionFrequency]
      ,[EventFrequency].[DelayedIgnitionFrequency]
      ,[Result].[OnshoreCaseID]
INTO [%s].[SafetiRisk].[UpdatedEventFreq]
FROM [%s].[SafetiRisk].[EventFrequency]
LEFT OUTER JOIN [%s].[SafetiRisk].[Result]
ON [EventFrequency].[ResultID] = [Result].[ResultID]
""" %(DATABASE_NAME, DATABASE_NAME, DATABASE_NAME)

cursor = conn.cursor()
cursor.execute(create_table_query)
conn.commit() # 提交写入操作,确保表和数据生效
cursor.close()

# 第二步:查询新表数据加载到DataFrame
select_query = f"SELECT * FROM [{DATABASE_NAME}].[SafetiRisk].[UpdatedEventFreq]"
df1 = pd.read_sql(select_query, conn)
print(df1)

# 最后关闭连接
conn.close()

场景2:不需要存储新表,仅需获取关联后的DataFrame

直接去掉INTO子句,用单纯的关联查询语句传给pd.read_sql()即可一步完成:

Sql_Query = """
SELECT [EventFrequency].[ResultID]
      ,[EventFrequency].[EventFrequency]
      ,[EventFrequency].[ImmediateIgnitionFrequency]
      ,[EventFrequency].[DelayedIgnitionFrequency]
      ,[Result].[OnshoreCaseID]
FROM [%s].[SafetiRisk].[EventFrequency]
LEFT OUTER JOIN [%s].[SafetiRisk].[Result]
ON [EventFrequency].[ResultID] = [Result].[ResultID]
""" %(DATABASE_NAME, DATABASE_NAME)
df1 = pd.read_sql(Sql_Query,conn)
额外注意事项
  • 重复执行含SELECT INTO的代码会因目标表UpdatedEventFreq已存在报错,建议执行前增加表存在判断逻辑,或每次执行前删除旧表。
  • pypyodbc连接默认未开启自动提交,执行写入、建表等操作后必须调用conn.commit()确保操作生效。

内容的提问来源于stack exchange,提问作者Sundaram Kanagaraj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:27:07