【问题标题】:df.to_sql raises ValueError("Empty table or column name specified")df.to_sql 引发 ValueError("指定空表或列名")
【发布时间】:2022-01-12 03:26:42
【问题描述】:

list(df) 检索 df 数据帧的列标题。 headers_list 检索现有 438393848 表的现有列标题。我要做的是DROP df 中不存在的438393848 表的列标题,然后使用to_sql 方法将df 数据帧推入438393848 SQLite数据库。但是,df.to_sql 会引发 ValueError("Empty table or column name specified")。

with conn:
        c.execute(f"CREATE TABLE IF NOT EXISTS '438393848' ({list(df)[0]})")
        try:
            for header in list(df)[1:]:
                c.execute(f"ALTER TABLE '438393848' ADD COLUMN {header}")
        except:
               pass
        colnames = conn.execute("SELECT * FROM '438393848'").description
        headers_list = list(map(lambda x: x[0], colnames))
        for column in headers_list:
            if column not in list(df):
                c.execute(f"ALTER TABLE '438393848' DROP COLUMN {column}")
        colnamesnew = conn.execute("SELECT * FROM '438393848'").description
    df.to_sql('438393848', conn, if_exists='replace', index=False)

对于上下文,我在另一组代码中编辑了df 数据框,这使得df 与SQLite 表438393848 不同步。我想要做的是使用这组代码来更新我的表438393848 的列,以便在列匹配后df 可以推送到SQLite 表。运行一次代码后,通过打印表438393848,列为DROPed,并根据数据框df的列标题。

有谁知道问题出在哪里?

【问题讨论】:

  • 在使用for column in headers_list: 循环之前尝试print(headers_list)。它打印什么?

标签: python sql pandas dataframe sqlite


【解决方案1】:

在重新阅读 df.to_sql 文档后,if_exists=replace 参数会删除该表并将该表替换为一个全新的数据集,在本例中为 df。因此,上述代码无需替换列标题名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 2019-12-23
    • 1970-01-01
    • 2023-01-31
    • 2021-09-23
    • 2016-02-22
    • 2021-03-16
    • 2019-01-03
    相关资源
    最近更新 更多