我想设置一个每天将数据转储到SQL表中的作业,覆盖现有数据。
df.to_sql(table_name, engine, schema='dbo',
index=True, index_label='IdColumn',
if_exists='replace')
然而,在幕后,SQLAlchemy尝试使用IdColumn VARCHAR(max)创建表,并且可以为空。因此,SQL在尝试创建索引时会抛出错误。
在向我写入数据之前截断表格是非常简单的,但我觉得应该有一个更优雅的解决方案来解决这个问题。
答案 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)})