当前位置: 首页 > 面试题库 >

如何将Pandas DataFrame升级到PostgreSQL表?

林辰钊
2023-03-14
问题内容

我已经从网络资源中抓取了一些数据并将其全部存储在pandas
DataFrame中。现在,为了利用SQLAlchemy提供的强大的db工具,我想将所说的DataFrame转换为Table()对象,并最终将所有数据上载到PostgreSQL表中。如果可行,那么完成此任务的可行方法是什么?


问题答案:

如果您使用的是PostgreSQL 9.5或更高版本,则可以使用临时表和一条INSERT ... ON CONFLICT语句执行UPSERT :

with engine.begin() as conn:
    # step 0.0 - create test environment
    conn.execute(sa.text("DROP TABLE IF EXISTS main_table"))
    conn.execute(
        sa.text(
            "CREATE TABLE main_table (id int primary key, txt varchar(50))"
        )
    )
    conn.execute(
        sa.text(
            "INSERT INTO main_table (id, txt) VALUES (1, 'row 1 old text')"
        )
    )
    # step 0.1 - create DataFrame to UPSERT
    df = pd.DataFrame(
        [(2, "new row 2 text"), (1, "row 1 new text")], columns=["id", "txt"]
    )

    # step 1 - create temporary table and upload DataFrame
    conn.execute(
        sa.text(
            "CREATE TEMPORARY TABLE temp_table (id int primary key, txt varchar(50))"
        )
    )
    df.to_sql("temp_table", conn, index=False, if_exists="append")

    # step 2 - merge temp_table into main_table
    conn.execute(
        sa.text("""\
            INSERT INTO main_table (id, txt) 
            SELECT id, txt FROM temp_table
            ON CONFLICT (id) DO
                UPDATE SET txt = EXCLUDED.txt
            """
        )
    )

    # step 3 - confirm results
    result = conn.execute(sa.text("SELECT * FROM main_table ORDER BY id")).fetchall()
    print(result)  # [(1, 'row 1 new text'), (2, 'new row 2 text')]


 类似资料:
  • 我正在尝试将log4j升级到log4j2。我试图升级的特定代码行是: 静态字段在新的中不再可用。相反,似乎使用了静态方法来访问优先级int值,可以将指定为。 但是,此方法还需要指定。在调用时,如何知道要指定哪个? 旧优先级:https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/priority.html 新优先级:https:/

  • 是否可以在PostgreSQL中执行多值upsert?我知道存在多值插入,“ON CONFLICT”关键字在违反密钥时执行更新……但有可能将两者结合起来吗?大概是这样。。。 我用谷歌搜索了这个面包屑,找不到任何关于它的东西。 我有一个应用程序正在利用pg-promise,我正在做批处理。它可以工作,但它的速度非常慢(比如每5秒左右就有50行......)。我想,如果我能取消批处理,而是正确地构建这

  • 我刚刚将mac OS X更新到Yosemite10.10.4版本,并将postgresql更新到:psql(postgresql)9.4.4。

  • 最近对OSX Mavericks的升级中断了我的Rails应用程序的数据库连接。 当我尝试从数据库中提取时,服务器返回以下错误: 当尝试运行时,我得到: 我已经尝试了许多在互联网上可用的解决方案。例如重新安装pg gem并在my database.yml中设置host:localhost。我的/usr/local/var/postgres/pg_hba.conf文件显示: 返回哪个psql: 这件

  • 问题内容: 我想将我的pandas DataFrame插入到SQL Server表中。这个问题为PostgreSQL提供了一个可行的解决方案,但T- SQL没有的变体。如何为SQL Server完成同一件事? 问题答案: 有两种选择: 使用语句代替。 使用带a的语句,后跟条件语句。 MERGE的T-SQL文档说: 性能提示:当两个表具有匹配特征的复杂混合时,为MERGE语句描述的条件行为最有效。例

  • 升级准备工作: pika在2.3.3版本时为了确保同步的可靠性,增加了server-id验证功能,因此pika2.3.3~pika2.3.6与pika2.3.3之前的版本无法互相同步 如果你的pika版本<2.3.3, 你需要准备pika2.3.6及pika3.0.16的bin文件,这里需要注意的是3.0.x需要准备3.0.16以后的版本(或者3.0.6版本),其他版本pika不再能与低版本(2.