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

Error while inserting records with Null values into SQL Server using Pymssql

我有一组记录需要使用 pymssql 插入到 Sql 服务器数据库中。这些记录具有来自预测模型的概率分数以及一堆其他列。出于测试目的,我创建了一个 excel 文件,其中包含我要插入 MS Sql 服务器 Table.

的值

这些列中的某些记录具有空值,当我尝试插入它们时会导致出现问题。

下面是我的代码

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()

当我从插入语句中完全删除具有空值的列时代码工作正常,但是 return 当我包含它们时出现以下错误。

错误:

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

非常感谢任何帮助!

Invalid column name '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)

只需将数据帧 NaN 替换为 None 对象: df.where((pd.notnull(df)), None)