pandas.to_sql 函数没有按预期转换 dtype
pandas.to_sql function does not convert dtype as expected
我正在尝试使用以下代码将 pandas df 导出到 SQL 服务器:
dtypedict={"column1": sqlalchemy.types.VARCHAR(length=50),
"column2": sqlalchemy.types.VARCHAR(length=50),
'column3': sqlalchemy.types.VARCHAR(length=50),
'column4': sqlalchemy.types.INTEGER(),
'column5': sqlalchemy.types.Date(),
'column6': sqlalchemy.types.VARCHAR(length=50),
'column7': sqlalchemy.types.VARCHAR(length=50),
'column8': sqlalchemy.types.VARCHAR(length=50),
'column9': sqlalchemy.types.VARCHAR(length=50)}
staging.columns = staging.columns.str.replace(' ','_')
staging.fillna('', inplace=True)
server = 'SV'
database = 'DB'
username = 'U'
password = 'PW'
cnxn = 'DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password
engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(cnxn))
staging.to_sql('Staging_table', schema='dbo', con=engine, chunksize=50, index=False, if_exists='replace', dtype=dtypedict, method='multi')
出于某种原因,我不断收到以下错误:
('22018', "[22018] [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting the nvarchar value 'No EQ' to data type int. (245) (SQLExecDirectW)")
此 'No EQ' 值出现在第 2 列中。我不明白为什么函数会尝试将 nvarchar 转换为 int,因为指定的 dtype 是 varchar。检查 Azure Data Studio 中的列类型,varchar 也被正确解析为 column2 的 sql 类型。 df 数据类型是对象。
不幸的是,我必须使用旧的 SQL 服务器驱动程序,并且由于权限限制无法下载最新的 ODBC。
有人对如何解决这个问题有建议吗?
我仔细检查了 dict 中的列名是否正确命名,它们是因为一切都解析为 true:
col_list = staging.columns.to_list()
for col in col_list:
for key in dtypedict.items():
if col in key:
print('True for ' + col)
看起来 df 或 to_sql 过程中的对象数据类型对于看似包含整数值和字符串值并被误解为 int 列的列不起作用,即使数据类型是用字典.
我使用 .astype(str) 函数转换了所有组合的 dtype 列,现在 to_sql 适用于所有列!
我正在尝试使用以下代码将 pandas df 导出到 SQL 服务器:
dtypedict={"column1": sqlalchemy.types.VARCHAR(length=50),
"column2": sqlalchemy.types.VARCHAR(length=50),
'column3': sqlalchemy.types.VARCHAR(length=50),
'column4': sqlalchemy.types.INTEGER(),
'column5': sqlalchemy.types.Date(),
'column6': sqlalchemy.types.VARCHAR(length=50),
'column7': sqlalchemy.types.VARCHAR(length=50),
'column8': sqlalchemy.types.VARCHAR(length=50),
'column9': sqlalchemy.types.VARCHAR(length=50)}
staging.columns = staging.columns.str.replace(' ','_')
staging.fillna('', inplace=True)
server = 'SV'
database = 'DB'
username = 'U'
password = 'PW'
cnxn = 'DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password
engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(cnxn))
staging.to_sql('Staging_table', schema='dbo', con=engine, chunksize=50, index=False, if_exists='replace', dtype=dtypedict, method='multi')
出于某种原因,我不断收到以下错误:
('22018', "[22018] [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting the nvarchar value 'No EQ' to data type int. (245) (SQLExecDirectW)")
此 'No EQ' 值出现在第 2 列中。我不明白为什么函数会尝试将 nvarchar 转换为 int,因为指定的 dtype 是 varchar。检查 Azure Data Studio 中的列类型,varchar 也被正确解析为 column2 的 sql 类型。 df 数据类型是对象。
不幸的是,我必须使用旧的 SQL 服务器驱动程序,并且由于权限限制无法下载最新的 ODBC。
有人对如何解决这个问题有建议吗?
我仔细检查了 dict 中的列名是否正确命名,它们是因为一切都解析为 true:
col_list = staging.columns.to_list()
for col in col_list:
for key in dtypedict.items():
if col in key:
print('True for ' + col)
看起来 df 或 to_sql 过程中的对象数据类型对于看似包含整数值和字符串值并被误解为 int 列的列不起作用,即使数据类型是用字典.
我使用 .astype(str) 函数转换了所有组合的 dtype 列,现在 to_sql 适用于所有列!