使用to_sql写入datetime.date时出现OperationalError
我正在使用最新的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.date
和 datetime.time
类型的数据(https://github.com/pydata/pandas/pull/8090,现在正在开发中)。
目前(0.14.1 版本)还不支持 datetime.date
和 datetime.time
类型(只支持 datetime64
类型,而 datetime.datetime
会被转换成这个类型),不过添加这个功能应该不难(有个相关的问题在这里:https://github.com/pydata/pandas/issues/6932)。
现在的问题是,to_sql
在数据库中为 datetime.date
列创建的是文本类型的列(就像处理所有 object
类型的列一样)。因此你会看到上面的错误信息。
目前的一个可能解决办法是自己创建数据库,然后把数据框(dataframe)追加到里面。