Lambda导入S3 CSV至RDS SQL Server报Invalid column name 'nan'错误
问题排查与解决
错误原因
errorMessage": "(207, b"Invalid column name 'nan'.DB-Lib error message
该报错的核心是CSV中的空值被pandas读取为NaN后,Lambda运行环境的依赖(pymssql/pandas)版本没有自动将NaN转换为SQL识别的NULL,而是直接作为字符串'nan'传入插入语句,SQL Server无法识别该值,误判为列名触发报错。
本地运行正常是因为你本地的pymssql或pandas版本对空值的默认处理逻辑和Lambda部署环境不一致,本地会自动转NULL,Lambda环境没有对应的兼容逻辑。
修复步骤
步骤1:读取CSV时指定空值转换规则
调整pd.read_csv参数,直接将空值转为SQL兼容的None,你之前配置的quotechar不解决空值问题可以去掉:
sub_df = pd.read_csv(StringIO(csv_string), sep = ',') # 将所有NaN替换为None,pymssql会自动把None转为SQL的NULL sub_df = sub_df.where(pd.notnull(sub_df), None)
步骤2:修正代码笔误(可选但建议)
你代码中写的sub_df.itterrows()是拼写错误,正确写法为iterrows(),部分环境下该笔误会触发隐式容错导致逻辑异常,建议修正。
步骤3:可选性能优化
如果数据量较大,建议改用批量插入替代逐行执行,降低数据库交互开销:
# 先把所需字段转为元组列表 records = sub_df[['f_name','lname','email_address','street_ad','city','state','zip','country']].values.tolist() # 批量执行插入 cursor.executemany('''INSERT INTO dbo.anjou_class(firstname,lastname, email, street, city, state, zip, country_code) VALUES(%s,%s,%s,%s,%s,%s,%s,%s)''', records)
内容的提问来源于stack exchange,提问作者cocktail Enthusiast
相关产品推荐
相关产品推荐

