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