Pandas DataFrame.to_sql() 函数是不是需要后续的 commit()?

Posted

技术标签:

【中文标题】Pandas DataFrame.to_sql() 函数是不是需要后续的 commit()?【英文标题】:Does the Pandas DataFrame.to_sql() function require a subsequent commit()?Pandas DataFrame.to_sql() 函数是否需要后续的 commit()? 【发布时间】:2018-05-24 07:37:40 【问题描述】:

可用于DataFrame 对象的Pandas 函数to_sql() 的文档(请参阅to_sql() documentation)并未说明需要(或推荐)对连接进行commit() 调用以保持更新。

我可以安全地假设DataFrame.to_sql('table_name', con) 将始终自动提交更改(例如:con.commit())吗?

【问题讨论】:

【参考方案1】:

是的,到最后会自动提交。

Pandas calls SQLAlchemy method executemany(用于 SQL Alchemy 连接):

conn.executemany(self.insert_statement(), data_list)

for SQLite connection:

def run_transaction(self):
    cur = self.con.cursor()
    try:
        yield cur
        self.con.commit()
    except:
        self.con.rollback()
        raise
    finally:
        cur.close()

由于最后SQL Alchemy docs executemany 问题commit

【讨论】:

Pandas 函数 to_sql() 在未安装 SQLAlchemy 时也可以工作,在这种情况下它使用 sqlite(如果我正确理解文档的话)。那么commit是否也有保证? 我无法(明确地)发现 Pandas 中不推荐使用 SQLite 连接。对此有一些讨论(here 和 here),我的理解是 SQLite 连接(通过sqlite3)仍然是受支持的功能(可能在“旧”标志下)。 @TomVerhoeff,是的,没错。对于误导性信息,我们深表歉意。我把它和deprecated flavor in to_sql 代码行的链接不再适用,因为它们没有引用特定的 git 修订版,因此现在很难遵循。如果我们可以通过 sqlalchemy api 显式控制提交行为作为对此的回答,那就太好了。 我想我在 github.com/pandas-dev/pandas/blob/… 中没有看到明确的提交,这是 Pandas 为此调用的。似乎sqlite的python API不会自动提交if I'm looking in the right place。另一方面,对于 sqlite,您不能 create_engine(isolation_level="AUTOCOMMIT"),所以我还不确定使用 sqlalchemy 的 sqlite 的默认提交行为是什么。

以上是关于Pandas DataFrame.to_sql() 函数是不是需要后续的 commit()?的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyODBC 的 fast_executemany 加速 pandas.DataFrame.to_sql

pandas DataFrame.to_sql 和 nan 值

Pandas DataFrame.to_sql() 错误 - 在字符串格式化期间并非所有参数都转换

pandas DataFrame.to_sql() 函数 if_exists 参数不起作用

Python:使用 dataframe.to_sql 向 MySQL 添加主键

如何将 DataFrame 写入 postgres 表?