python - 使用 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 并根据数据库检查每个数据行,还是有更优雅的方法来做到这一点?以及如何迭代数据框的最佳方式?
解决方案
您可以在 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;
推荐阅读
- javascript - Vue v-model 针对 v-for 循环中的其他元素——如何构造 v-model 数组结构来避免这种情况
- mysql - 根据 int 中的数字将一列拆分为两列
- angular - Angular Animation 仅适用于第一次点击
- ruby-on-rails - 如何给表名起别名?
- javascript - 如何访问函数外部的变量?
- asp.net - 应用程序设置和应用程序构建事件中的 ASP.NET 参数/变量
- javascript - 标题 CSS 样式间距
- android - 如何在android中通过抽屉在导航中的片段之间进行动画过渡
- javascript - 如果获取请求失败,如何停止功能
- c - 未定义类型“结构数据”的无效使用