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
相关产品推荐
相关产品推荐

