使用对 Pandas Dataframe 的更改来更新 Postgres 数据库

问题描述 投票:0回答:1

我有一个 Postgres 数据库,其中包含一个我也想进行一些更改的表。我从包含超过 500,0000 条记录的表中选择了 1000 条记录,并通过添加/更新列 C 和 D 来处理它们。

数据库表

PK col c col d
一个 更新了 更新了
from sqlalchemy import create_engine

engine = create_engine(f'postgresql://{db_usr}:{db_pwd}@{db_host}:{db_port}/{db_name}')
df = pd.read_sql('Select * FROM db_table LIMIT 1000', engine)

接下来,我对 pandas 数据框中的 C 列和 D 列进行了一些更改,现在想要将这些列更新回 Postgres 数据库(没有对 B 列进行任何更改,我不想将其写回数据库)。

我现在有以下代码,它运行没有错误,但没有对数据库进行任何更改。第一次运行时创建了一个临时表,我手动删除了该表,现在没有对数据库进行任何更改

´´´ conn = psycopg2.connect(f"dbname='{cfg.db_name}' 用户='{cfg.db_usr}' 主机='{cfg.db_host}' 密码='{cfg.db_pwd}'") cur = conn.光标()

rows = zip(df_properties.index, df_properties.score)


cur.execute("""CREATE TEMP TABLE listing_scores(pk INTEGER, score INTEGER) ON COMMIT DROP""")
cur.executemany("""INSERT INTO listing_scores (pk, score) VALUES(%s, %s)""", rows)
cur.execute(f"""
    UPDATE {cfg.db_rm_table}
    SET score = listing_scores.score
    FROM listing_scores
    WHERE listing_scores.pk = {cfg.db_rm_table}.pk;
    """)

print(cur.rowcount)
conn.commit()
cur.close()
conn.close()´´´
pandas postgresql sql-update
1个回答
0
投票

我使用 pyodbc 和 SQL Server,但我认为当您提到临时表时您已经找到了解决方案。如果您从 SQL 查询创建数据帧,则可以将这些行插入数据库临时表中,然后运行更新语句,如伪代码中所示。此示例适用于 SQL Server,因此您可能需要针对 Postgres 进行修改。因此,使用光标设置临时表:

cur.execute(f"""
USE [database_name];
CREATE TABLE #ttable (
column [datatype] (size) NULL ,
...
lastcolumn [datatype] (size) NULL);
    """)

接下来,迭代数据帧以将行插入临时表中。这可能需要一些时间,具体取决于列数、数据量、数据库配置等。首先,您需要为 INSERT 设置一个字符串

对于索引,df.iterrows() 中的行: cur.execute()

© www.soinside.com 2019 - 2024. All rights reserved.