【问题标题】:Pandas to_sql Trying to Index Nullable ColumnPandas to_sql 试图索引可空列
【发布时间】:2015-12-30 17:39:09
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python sql pandas


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      考虑使用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)})
      

      【讨论】:

      • 我刚刚为类似的问题尝试了这种方法here,但我发现dtype 似乎不会影响index 列(即使我们给它一个明确的index_label ),只有“真实”数据列。
      猜你喜欢
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 2019-12-21
      • 2012-02-28
      • 2017-10-12
      • 2018-04-09
      相关资源
      最近更新 更多