如何将 DataFrame 写入 postgres 表

新手上路,请多包涵

有 _DataFrame.tosql 方法,但它仅适用于 mysql、sqlite 和 oracle 数据库。我无法将 postgres 连接或 sqlalchemy 引擎传递给此方法。

原文由 m9_psy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 880
2 个回答

从 pandas 0.14(2014 年 5 月末发布)开始,支持 postgresql。 sql 模块现在使用 sqlalchemy 来支持不同的数据库风格。您可以为 postgresql 数据库传递一个 sqlalchemy 引擎(参见 文档)。例如:

 from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@localhost:5432/mydatabase')
df.to_sql('table_name', engine)


你是对的,在 0.13.1 版之前的 pandas 中不支持 postgresql。如果您需要使用旧版本的熊猫,这里是 pandas.io.sql 的补丁版本: https ://gist.github.com/jorisvandenbossche/10841234。

我之前写过这个,所以不能完全保证它总是有效,但基础应该在那里)。如果将该文件放在工作目录中并导入它,那么您应该可以这样做(其中 con 是一个 postgresql 连接):

 import sql  # the patched version (file is named sql.py)
sql.write_frame(df, 'table_name', con, flavor='postgresql')

原文由 joris 发布,翻译遵循 CC BY-SA 4.0 许可协议

更快的选择:

以下代码将比 df.to_sql 方法更快地将 Pandas DF 复制到 postgres DB,并且您不需要任何中间 csv 文件来存储 df。

根据您的数据库规范创建引擎。

在您的 postgres 数据库中创建一个表,该表具有与 Dataframe (df) 相同的列数。

DF 中的数据将 插入 到您的 postgres 表中。

 from sqlalchemy import create_engine
import psycopg2
import io

如果你想替换表,我们可以使用 df 中的标头用普通的 to_sql 方法替换它,然后将整个大耗时的 df 加载到 DB 中。

     engine = create_engine('postgresql+psycopg2://username:password@host:port/database')

    df.head(0).to_sql('table_name', engine, if_exists='replace',index=False) #drops old table and creates new empty table

    conn = engine.raw_connection()
    cur = conn.cursor()
    output = io.StringIO()
    df.to_csv(output, sep='\t', header=False, index=False)
    output.seek(0)
    contents = output.getvalue()
    cur.copy_from(output, 'table_name', null="") # null values become ''
    conn.commit()

原文由 Aseem 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题