首页 > 解决方案 > 使用 DataFrame 中的数据更新 postgresql 表

问题描述

我有一个表,我的 basedata 作为 postgresql 表,让它成为'basedata':

basedata:

id,name,age,height
1,john,17,185
2,nick,24,174
3,sarah,19,165

这是一个带有主键 'id' 的 postgresql 表。

现在我将收到一个熊猫数据框,其中包含有关相应人员的新数据或更新数据,例如:

new_data:

id,name,age,height
17,harry,26,177
23,mary,14,145
2,nick,25,174
3,sarah,19,165

逻辑应该是:

new id -> insert into database
id already exists -> do nothing if every field is the same (like for sarah)
id already exists -> update differing fields

结果应该是:

basedata:

id,name,age,height
1,john,17,185
2,nick,25,174
3,sarah,19,165
17,harry,26,177
23,mary,14,145

我正在努力如何以最好的方式做到这python一点psycopg2

我需要遍历 DataFrame 并根据数据库检查每个数据行,还是有更优雅的方法来做到这一点?以及如何迭代数据框的最佳方式?

标签: pythonpandaspostgresqldataframepsycopg2

解决方案


您可以在 SQL 级别执行此操作,而不是遍历 DataFrame。(由于您没有提供代码片段,因此无法从代码级别提供确切的解决方案)

  • 假设表创建如下所示,
CREATE TABLE basedata (
   id INTEGER PRIMARY KEY UNIQUE,
   name VARCHAR NOT NULL,
   age INTEGER NOT NULL,
   height INTEGER NOT NULL
);

新数据

INSERT INTO basedata (id,name, age, height)
VALUES
   (1, 'john', 17, 185),
   (2, 'nick', 24, 174),
   (3, 'sarah', 19, 165);

更新数据

INSERT INTO basedata (id, name, age, height)
VALUES
   (17, 'harry', 26, 177),
   (23, 'mary', 14, 145),
   (2, 'nick', 25, 174),
   (3, 'sarah', 19, 165)
ON CONFLICT (id)
DO NOTHING;

更多说明:- PostgreSQL Upsert 使用 INSERT ON CONFLICT 语句


推荐阅读