Pandas to_sql试图索引可空列

时间:2015-12-29 17:14:58

标签: python sql pandas

我想设置一个每天将数据转储到SQL表中的作业,覆盖现有数据。

df.to_sql(table_name, engine, schema='dbo', 
          index=True, index_label='IdColumn', 
          if_exists='replace')

然而,在幕后,SQLAlchemy尝试使用IdColumn VARCHAR(max)创建表,并且可以为空。因此,SQL在尝试创建索引时会抛出错误。

在向我写入数据之前截断表格是非常简单的,但我觉得应该有一个更优雅的解决方案来解决这个问题。

2 个答案:

答案 0 :(得分:1)

如果您希望将索引写入sql表作为普通列,则可以在reset_index调用之前执行to_sql

df.reset_index().to_sql(table_name, engine, schema='dbo', index=False, if_exists='replace')

唯一的问题是该列的名称,如果您想要一个自定义的列,首先必须设置索引名称(df.index.name = 'IdColumn')或在reset_index之后重命名。

答案 1 :(得分:0)

考虑使用dtype参数,该参数将数据框列名称的字典映射到指定的sqlalchemy data types。您可以尝试Varchar

import sqlalchemy

df.to_sql(table_name, engine, schema='dbo', 
          index=True, index_label='IdColumn', 
          if_exists='replace',
          dtype={'IdColumn': sqlalchemy.types.VARCHAR(length=255)})

或通用String类型,指定长度:

from sqlalchemy.types import String

df.to_sql(table_name, engine, schema='dbo', 
          index=True, index_label='IdColumn', 
          if_exists='replace',
          dtype={'IdColumn': String(length=255)})