使用to_sql编写datetime.date会引发OperationalError

时间:2014-08-06 13:30:51

标签: python sql sql-server pandas

我正在使用最新的pandas 14.1并使用to_sql方法写入MS SQL Server 2008 v2服务器。使用SQLalchemy作为引擎。以下具有datetime对象的数据框按预期工作。

#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中新创建的功能的错误。但不确定。

1 个答案:

答案 0 :(得分:1)

更新:从pandas 0.15开始,to_sql支持编写datetime.datedatetime.timehttps://github.com/pydata/pandas/pull/8090的列,现在处于开发版本。)


目前支持datetime.datedatetime.time类型(0.14.1)尚未实施(仅适用于datetime64类型,datetime.datetime将转换为但是,添加它应该很容易(它有一个问题:https://github.com/pydata/pandas/issues/6932)。

问题在于,to_sql目前在datetime.date列的数据库中创建了一列文本类型(就像object dtype的所有列一样)。因此,您收到上述错误消息 现在可能的解决方案是自己创建数据库,然后将数据框附加到它。