Python提取Excel写入SQL Server返回数值异常求助
Python Excel数据提取至SQL Server的Oil值异常问题解决
问题说明
SQL Server表字段定义:
- Well Name: varchar
- Date: date
- Oil: float
Excel数据位置:
- 井名存于B44行
- 原油值存于B78行(部分为空或0)
当前问题:提取后所有Oil值均为Null,不符合预期——仅无值/Null记录需跳过,有效数值需保留。
现有代码示例
import pandas as pd import pyodbc # 读取Excel文件 excel_data = pd.read_excel("well_production.xlsx", header=None) well_name = excel_data.iloc[43, 1] # B44行对应索引(43,1) oil_val = excel_data.iloc[77, 1] # B78行对应索引(77,1) # 连接SQL Server conn_str = "DRIVER={SQL Server};SERVER=your_server;DATABASE=your_db;UID=your_user;PWD=your_pwd" conn = pyodbc.connect(conn_str) cursor = conn.cursor() # 处理Oil值逻辑 if not oil_val: oil_val = None # 插入数据 insert_sql = """INSERT INTO WellProduction ([Well Name], [Date], [Oil]) VALUES (?, GETDATE(), ?)""" cursor.execute(insert_sql, well_name, oil_val) conn.commit() # 关闭连接 cursor.close() conn.close()
当前输出
SQL表中所有记录的Oil字段均为NULL,包括Excel中B78行存在有效数值的情况。
预期输出
- Excel中B78行为空/无值时:Oil字段存
NULL或跳过该记录 - Excel中B78行为有效数值(含0,若业务认定0为有效)时:Oil字段保留对应数值
问题根源与解决方法
问题根源
代码中if not oil_val:的判断逻辑存在缺陷:在Python中,数值0的布尔值为False,会被误判为空值,进而被设置为None,导致所有Oil值写入SQL时都变成NULL。
修正方案
调整Oil值的判断逻辑,仅将真正的空值(如pd.NA、None、空字符串)设为None,保留有效数值(包括0,若业务允许):
# 修正后的Oil值处理逻辑 if pd.isna(oil_val) or oil_val == '': oil_val = None # 若业务认定0为无效值,需设为NULL则添加判断: # if pd.isna(oil_val) or oil_val == '' or oil_val == 0: # oil_val = None
完整修正代码
import pandas as pd import pyodbc # 读取Excel文件 excel_data = pd.read_excel("well_production.xlsx", header=None) well_name = excel_data.iloc[43, 1] oil_val = excel_data.iloc[77, 1] # 连接SQL Server conn_str = "DRIVER={SQL Server};SERVER=your_server;DATABASE=your_db;UID=your_user;PWD=your_pwd" conn = pyodbc.connect(conn_str) cursor = conn.cursor() # 修正后的空值判断 if pd.isna(oil_val) or oil_val == '': oil_val = None # 若需跳过空值记录,可添加判断:if oil_val is not None: 再执行插入 insert_sql = """INSERT INTO WellProduction ([Well Name], [Date], [Oil]) VALUES (?, GETDATE(), ?)""" cursor.execute(insert_sql, well_name, oil_val) conn.commit() cursor.close() conn.close()
验证结果
修正后,Excel中B78行的有效数值(包括0,若未额外排除)会被正确写入SQL的Oil字段,仅空值/无值的情况会被设为NULL或跳过(若添加跳过逻辑)。
内容的提问来源于stack exchange,提问作者Justin Massaro
相关产品推荐
相关产品推荐

