pandas dataframe.to_sql在Jupyter正常但VSCode报错的问题解决
解决sqlalalchemy+pyodbc写入SQL Server时的HY104无效精度值错误
问题背景
一段操作SQL Server的Python代码在Anaconda根环境的Jupyter Notebook中运行正常,但将相同代码放到新创建的虚拟环境(VSCode或新Jupyter虚拟环境)执行时,df_clean.to_sql()行抛出HY104错误,提示“无效的精度值”(对应错误信息中的意大利语“Valore di precisione non valido”)。
运行代码
import pyodbc import sqlalchemy user_id = 'userid' password = 'password' server = 'server' database_name = 'database_name' driver = 'SQL Server' connection_string = ( f'DRIVER={{{driver}}};' f'SERVER={server};' f'DATABASE={database_name};' f'UID={user_id};' f'PWD={password};') conn = pyodbc.connect(connection_string) cursor = conn.cursor() cursor.execute("TRUNCATE TABLE [Startup];") conn.commit() connection_string = f'mssql+pyodbc://{user_id}:{password}@{server}/{database_name}?driver={driver}' engine = sqlalchemy.create_engine(connection_string) df_clean.to_sql('Startup', engine, if_exists='replace', index=False) conn.commit()
报错信息
(pyodbc.Error) ('HY104', '[HY104] [Microsoft][ODBC SQL Server Driver]Valore di precisione non valido. (0) (SQLBindParameter)') [SQL: SELECT [INFORMATION_SCHEMA].[TABLES].[TABLE_NAME] FROM [INFORMATION_SCHEMA].[TABLES] WHERE ([INFORMATION_SCHEMA].[TABLES].[TABLE_TYPE] = CAST(? AS NVARCHAR(max)) OR [INFORMATION_SCHEMA].[TABLES].[TABLE_TYPE] = CAST(? AS NVARCHAR(max))) AND [INFORMATION_SCHEMA].[TABLES].[TABLE_NAME] = CAST(? AS NVARCHAR(max)) AND [INFORMATION_SCHEMA].[TABLES].[TABLE_SCHEMA] = CAST(? AS NVARCHAR(max))] [parameters: ('BASE TABLE', 'VIEW', 'Startup', 'dbo')]
排查细节
- 新环境中TRUNCATE语句执行正常,已确认
df_clean数据无异常 - 环境差异对比:仅Anaconda根环境(预装数千个包)能正常运行,新虚拟环境(仅安装项目依赖包)出现错误
- 排除常见原因:根环境中相同数据可正常写入,排除数据与表结构不匹配的问题
最终解决方法
在创建sqlalchemy引擎时添加use_setinputsizes=False参数,修改后的代码片段:
engine = sqlalchemy.create_engine(connection_string, use_setinputsizes=False)
添加该参数后,代码在新虚拟环境中可正常执行to_sql操作。
内容的提问来源于stack exchange,提问作者Federicofkt
相关产品推荐
相关产品推荐

