我有一组记录,需要使用pymssql插入到Sql Server数据库中。这些记录具有来自预测模型的概率得分以及其他许多列。为了进行测试,我创建了一个Excel文件,其中包含要插入到MS Sql Server表中的值。
这些列中的某些记录具有空值,当我尝试插入它们时会引起问题。
下面是我的代码
import pymssql
import pandas as pd
conn = pymssql.connect(server='server name', user='uid', password='pwd',
database='dbname')
cursor=conn.cursor()
#Read Scores from Excel
df = pd.read_excel("Sample_Score_Records.xlsx")
for index,row in df.iterrows():
cursor.execute("INSERT INTO dbo.ANLY_SCORE([id],[scoredatetime],[score1],[score2],[model_name],[score_id],[updated_revenue_ind])
values(%s,%d,%d,%d,%s,%s,%s)", (row['id'],row['scoredatetime'],row['score1'],row['score2'],row['model_name'],row['score_id'],row['updated_revenue_ind']))
conn.commit()
conn.close()
当我从插入语句中完全删除具有空值的列,但在包含它们时返回以下错误,代码工作正常。
错误:
ProgrammingError: (207, "Invalid column name 'nan'.DB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n")
下面是我的数据的外观
ID scoredatetime Score1 Score2 Model Name Score_id updated_revenue_ind
0015CF3EE2 10/17/2018 11:22:04 AM 0.2564859 0.365465 Model1 sana87y47164 y
0015CF3EE3 10/17/2018 11:22:04 AM 0.215485 0.458962 Model1 sana87y47165 n
0015CF3EE4 10/17/2018 11:22:04 AM 0.3458963 0.145893 Model1 sana87y47166 NULL
0015CF3EE5 10/17/2018 11:22:04 AM 0.265489 0.987513 Model1 sana87y47167 y
0015CF3EE6 10/17/2018 11:22:04 AM 0.324896 0.154787 Model1 sana87y47168 y
0015CF3EE7 10/17/2018 11:22:04 AM 0.386492 0.482172 Model1 sana87y47169 y
0015CF3EE8 10/17/2018 11:22:04 AM 0.2489714 0.897562 Model1 sana87y47170 y
0015CF3EE9 10/17/2018 11:22:04 AM 0.402365 0.147851 Model1 sana87y47171 n
0015CF3EE10 10/17/2018 11:22:04 AM 0.380236 0.278968 Model1 sana87y47172 NULL
0015CF3EE11 10/17/2018 11:22:04 AM 0.361245 0.478938 Model1 sana87y47173 NULL
非常感谢您的帮助!
答案 0 :(得分:1)
无效的列名“ nan”
问题在于,pandas不会将空值存储为Python None
,而是将其存储为NaN
。 pymssql似乎对此感到困惑。
您可能应该只安装SQLAlchemy,然后使用df.to_sql
插入行:
from sqlalchemy import create_engine
# ...
#Read Scores from Excel
df = pd.read_excel("Sample_Score_Records.xlsx")
# rename one DataFrame column to match table column name
df.rename({'Model Name': 'model_name'}, axis='columns', inplace=True)
# insert rows
engine = create_engine('mssql+pymssql://uid:pwd@servername/dbname')
df.to_sql('ANLY_SCORE', engine, schema='dbo', if_exists='append', index=False)
答案 1 :(得分:0)
只需将数据框NaN替换为None对象:
df.where((pd.notnull(df)), None)