【发布时间】:2021-09-19 19:52:29
【问题描述】:
我正在尝试使用以下代码将 pandas df 导出到 SQL Server:
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)")
此“无 EQ”值出现在第 2 列中。我不明白为什么函数会尝试将 nvarchar 转换为 int,因为指定的 dtype 是 varchar。检查 Azure Data Studio 中的列类型,varchar 也被正确解析为 column2 的 sql 类型。 df dtype 是对象。
不幸的是,由于权限限制,我不得不使用旧的 SQL 服务器驱动程序,并且无法下载最近的 ODBC 驱动程序。
任何人有建议如何解决这个问题?
我仔细检查了 dict 中的列名是否正确命名,并且它们都是正确的:
col_list = staging.columns.to_list()
for col in col_list:
for key in dtypedict.items():
if col in key:
print('True for ' + col)
【问题讨论】:
-
再次检查
dtypedict中的列名是否与 DataFrame 中的列名完全匹配。如果我们在dtype=中包含 DataFrame 中不存在的列名,则.to_sql()会默默地忽略它。 -
@GordThompson 一切似乎都匹配,我使用我编辑的帖子中的代码进行验证,一切都解决了。
-
如果使用from_sql,你会从数据库中得到哪些列名和数据类型?它们也与此匹配吗?
-
@rfkortekaas 列在导出时使用正确的 dtypes 导入,因此与最初声明的列和 sqlalchemy 类型相对应。
标签: sql pandas sqlalchemy