使用Pymssql将具有Null值的记录插入SQL Server时出错

时间:2018-10-17 19:57:36

标签: python sql-server pandas pymssql

我有一组记录,需要使用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

非常感谢您的帮助!

2 个答案:

答案 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)