使用to_sql写入datetime.date时出现OperationalError

3 投票
1 回答
2870 浏览
提问于 2025-04-18 16:14

我正在使用最新的pandas 14.1版本,并通过to_sql方法将数据写入MS SQL Server 2008 v2服务器。使用SQLalchemy作为引擎。下面这个包含日期时间对象的数据框工作得很好。

#test DataFrame
df1 = pd.DataFrame(index=range(10))
df1['A'] = 'Text'
df1['date_test'] = datetime.datetime(2014,1,1)

写入数据库的代码如下:

import sqlalchemy
engine = sqlalchemy.create_engine('mssql+pymssql://XXXXXXX')
df1.to_sql('test', engine, if_exists='replace')

由于业务原因,数据库中的数据需要是日期对象,而不是日期时间对象。如果我使用:

#test DataFrame
df2 = pd.DataFrame(index=range(10))
df2['A'] = 'Text'
df2['date_test'] = datetime.date(2014,1,1)  # date not datetime

那么to_sql方法会给出一个非常长的错误信息:

OperationalError: (OperationalError) (206, 'Operand type clash: datetime is incompatible 
with textDB-Lib error message 206, severity 16:\nGeneral SQL Server error:
Check messages from the SQL Server.......

我首先怀疑这可能是pandas 14.1中新功能的一个bug,特别是在使用日期时。不过我不太确定。

1 个回答

1

更新:从 pandas 0.15 版本开始,to_sql 可以支持写入 datetime.datedatetime.time 类型的数据(https://github.com/pydata/pandas/pull/8090,现在正在开发中)。


目前(0.14.1 版本)还不支持 datetime.datedatetime.time 类型(只支持 datetime64 类型,而 datetime.datetime 会被转换成这个类型),不过添加这个功能应该不难(有个相关的问题在这里:https://github.com/pydata/pandas/issues/6932)。

现在的问题是,to_sql 在数据库中为 datetime.date 列创建的是文本类型的列(就像处理所有 object 类型的列一样)。因此你会看到上面的错误信息。
目前的一个可能解决办法是自己创建数据库,然后把数据框(dataframe)追加到里面。

撰写回答