我有一个 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()´´´
我使用 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()