如何在不使用 SQLAlchemy 引擎的情况下将数据帧写入 Postgres 表?

2023-11-29

我有一个数据框,我想写入Postgres数据库。此功能需要成为Flask app.

现在,我通过创建一个单独的脚本来运行此插入部分SQLAlchemy 引擎并将其传递给df.to_sql()将数据框写入数据库表。

但是当我将此功能集成到 Flask 应用程序中时,我已经与Postgres使用创建的数据库Psycopg2 连接池.

当被看时df.to_sql()文档中提到它使用SQLAlchemy 引擎。我没有看到任何其他连接机制。https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html#pandas-dataframe-to-sql

我的问题是,当我拥有现有连接时,为什么需要创建这个 SQLAlchemy 引擎。为什么我不能使用它们?


您可以使用这些连接并避免 SQLAlchemy。这听起来相当不直观,但它会比常规插入快得多(即使您要删除 ORM 并进行一般查询,例如使用executemany)。即使使用原始查询,插入也很慢,但您会发现COPY中多次提到如何加快 PostgreSQL 中的插入性能。在这种情况下,我采用以下方法的动机是:

  1. Use COPY代替INSERT
  2. 不要相信 Pandas 会为此操作生成正确的 SQL(尽管,正如 Ilja Everilä 所指出的,这种方法实际上得到了在 V0.24 中添加到 Pandas)
  3. 不要将数据写入磁盘来创建实际的文件对象;把一切都记在记忆里

建议使用的方法cursor.copy_from():

import csv
import io
import psycopg2

df = "<your_df_here>"

# drop all the columns you don't want in the insert data here

# First take the headers
headers = df.columns

# Now get a nested list of values
data = df.values.tolist()

# Create an in-memory CSV file
string_buffer = io.StringIO()
csv_writer = csv.writer(string_buffer)
csv_writer.writerows(data)

# Reset the buffer back to the first line
string_buffer.seek(0)

# Open a connection to the db (which I think you already have available)
with psycopg2.connect(dbname=current_app.config['POSTGRES_DB'], 
                      user=current_app.config['POSTGRES_USER'],
                      password=current_app.config['POSTGRES_PW'], 
                      host=current_app.config['POSTGRES_URL']) as conn:
    c = conn.cursor()

    # Now upload the data as though it was a file
    c.copy_from(string_buffer, 'the_table_name', sep=',', columns=headers)
    conn.commit()

这应该比实际执行插入快几个数量级。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用 SQLAlchemy 引擎的情况下将数据帧写入 Postgres 表? 的相关文章

随机推荐

  • 从 Javascript 代码中隐藏 Excel 选项卡

    如何通过 Javascript 以编程方式隐藏 Excel 选项卡 ExcelSheetName Visible False 似乎不起作用 我用谷歌搜索了很多 但还没有收到正确的解决方案 怎么做 要隐藏 Excel 工作表 请设置Visib
  • 用 csv.DictWriter 写入部分行?

    我有一个包含一组输入的 CSV 文件 Example A B C D 我想分析结果并为每一行输出一个 CSV 文件 例如 B C The DictReader构建完整的字典 其中包含键 A B C D The DictWriter按预期设置
  • #define _UNICODE 不适用于 MinGW + CodeBlocks

    通常我使用 Visual Studio 但我切换到 mingw 我喜欢使我的应用程序可以轻松地从 unicode 和多字节更改 在我的 mingw 项目中我有我的定义并包含如下内容 define WIN32 LEAN AND MEAN de
  • 解析多个配置文件的最佳实践

    解析多个配置文件的最佳实践是什么 如果有的话 我想解析mysql服务器配置并重新编写配置 该配置允许发出多行 例如 includedir etc mysql d 有趣的是 某些配置可能位于主文件中 但其他配置可能位于子文件中 我认为 pyp
  • 使用 PHP 将 URL 中的空格替换为 %20

    我希望用 20 替换 url 中的所有空格实例 我将如何使用正则表达式做到这一点 谢谢你 如果您只想用另一个字符串替换一段字符串 则无需使用正则表达式 使用str replace 应该绰绰有余 new str replace 20 your
  • Django:如何让 South 为添加到 INSTALL_APPS 的第三方应用程序创建表?

    我正在尝试使用django 图像裁剪器 Link 在我的项目中 我将其添加到settings py中的INSTALL APPS中并成功解决 该应用程序需要一些数据库表才能使用 所以我必须创建它们 由于我一直在使用 South 因此我需要使用
  • iOS 库到 BitCode

    我最近下载了 Xcode 7 beta Xcode 抱怨我的一些 C 库没有编译成 BitCode 我该如何告诉 Clang 生成与 iOS 兼容的 BitCode 我在 stackoverflow 上看到过类似的答案 但我不知道它们是否适
  • 如何将元组数据提取为单元素格式

    我从以下内容中得到了良好的结果 但是如何从元组中提取该数据 换句话说 如何清理数据 这是数据库里的数据 我跑出来了 gt gt gt policy id 2309L 118L 94L gt gt gt for i in policy id
  • Visual Studio代码EPERM操作不允许

    每次我尝试在 vsc 上安装新扩展时 我都会得到 Error while loading extensions EPERM operation not permitted 接下来它告诉我打开一个 obsolete 文件 但它告诉我的文件路径
  • 在没有 Java EE 应用服务器的情况下使用 Web 服务在 C# 和 Java 之间进行互操作?

    我的处境很困难 我们有一个公开基于 Java 的 API 的第三方企业系统 然而 我们是一个100 Net 导向的开发团队 本质上 我需要用 C 代码可以调用的东西来包装 Java API Web 服务固然很棒 但我们的基础设施上唯一支持的
  • 从网址中删除 web/app_dev.php/

    我已经在 symfony 2 中完成了我的应用程序 现在我想从网址中删除 web app dev php 我读到了这一点 并在这样做之后 php app console cache clear env prod no debug 并添加 h
  • 创建 libcurl http post 表单

    我如何创建一个curl form 例如在stackoverflow上发帖 如果我查看问题表单页面的来源 我会看到
  • 有没有办法获取队列中的最后一个元素?

    我知道堆栈是最好也是最简单的方法 但是是否有可能获得队列中的最后一个元素而无需将任何内容出列 您可以简单地执行以下操作 Assumes T is a reference type if it s a value type then you
  • 删除文本文件中的特定行

    我正在研究一个选项 如果用户输入确切的标题和作者 该选项将能够删除指定的行 但是我无法让它发挥作用 我的功能内容如下所示 fnRemoveBook echo Title read Title echo Author read Author
  • 如何在java中从tcp流播放声音

    还有另一个应用程序在此套接字上写入原始 wav 文件 客户端启动并开始收听当前正在播放的歌曲 Socket clientSocket new Socket localhost 9595 AudioInputStream stream Aud
  • TypeScript 错误 TS2339:“EventTarget”类型上不存在属性“matches”

    我收到一个我无法从 TypeScript 中理解的错误 我正在使用一段完全有效的 JavaScript 但它在我的 IDE 中以及通过 Gulp 进行预处理期间都标记了错误 我已将其剥离回其核心 但仍然收到错误 即使这是完全有效的 JS d
  • 将段落的每一行包裹在一个跨度中

    我有一个 div 元素 它将显示一个没有换行符的段落 如示例中所示 div Lorem Ipsum is simply dummy text of the printing and typesetting industry Lorem Ip
  • 无法同时满足约束 - 没有适当的约束

    我已经检查并删除了每个用户限制 但仍然收到以下错误ONLY旋转设备后 我完全不知道为什么 有人有什么想法吗 2013 01 14 21 30 31 363 myApp 35869 c07 Unable to simultaneously s
  • 声纳添加新项目

    我正在尝试添加一个新项目到sonar 运行声纳跑步者时 我收到以下错误 任何人都可以帮助我解决这个问题 sonar runner Runner configuration file opt lampp htdocs typo3 sonar
  • 如何在不使用 SQLAlchemy 引擎的情况下将数据帧写入 Postgres 表?

    我有一个数据框 我想写入Postgres数据库 此功能需要成为Flask app 现在 我通过创建一个单独的脚本来运行此插入部分SQLAlchemy 引擎并将其传递给df to sql 将数据框写入数据库表 但是当我将此功能集成到 Flas