to_sql pandas方法更改sqlite表的模式

8 投票
1 回答
7818 浏览
提问于 2025-04-18 08:44

当我使用 to_sql 方法把 Pandas 的数据框写入我的 SQLite 数据库时,即使我选择了 if_exists='append',它还是会改变我表的 .schema(结构)。比如执行后

with sqlite3.connect('my_db.sqlite') as cnx:
    df.to_sql('Resolved', cnx, if_exists='append')

原来的 .schema 是:

CREATE TABLE `Resolved` (
`Name` TEXT NOT NULL COLLATE NOCASE,
`Count` INTEGER NOT NULL,
`Obs_Date` TEXT NOT NULL,
`Bessel_year` REAL NOT NULL,
`Filter` TEXT NOT NULL,
`Comments` TEXT COLLATE NOCASE
);

变成:

CREATE TABLE Resolved (
                  [Name] TEXT,
  [Count] INTEGER,
  [Obs_Date] TEXT,
  [Bessel_year] REAL,
  [Filter] TEXT,
  [Comments] TEXT

                  );

我该如何保存我表的原始结构呢?我使用的是 pandas 0.14.0 和 Python 2.7.5。

1 个回答

9

从0.14版本开始(你正在使用的版本),sql功能进行了重构,改用了sqlalchemy,这样可以提升功能性。你可以查看一下更新日志文档了解更多信息。
虽然仍然支持原始的sqlite3连接作为备用选项,但只有sqlite这种类型的数据库在没有sqlalchemy的情况下是可以使用的。

使用sqlalchemy应该能解决这个问题。你只需要创建一个sqlalchemy引擎,而不是直接使用sqlite连接cnx

engine = sqlalchemy.create_engine('sqlite:///my_db.sqlite')
df.to_sql('Resolved', engine, if_exists='append')

不过我已经为sqlite cnx备用选项的问题提交了一个报告:https://github.com/pydata/pandas/issues/7355

撰写回答