python-3.x - 基于python中postgres的主键更新表
问题描述
我有大约 1000 个不同的文件,我正在使用 python 将它们加载到 postgres 数据库中。我能够将 csv 文件插入表中,但如果记录已经加载到表中,它应该根据主键使用新值更新表,如果表中不存在主键,则应该插入。这意味着我需要根据主键更新插入(不指定主键的列名)
我尝试过的代码将 csv 插入到表中。
import csv
import psycopg2
conn = psycopg2.connect(user = "postgres",
password = "12345",
host = "127.0.0.1",
port = "5432",
database = "trial")
cur = conn.cursor()
f = open('/home/Documents/try.csv')
next(f)
cur.copy_from(f,'users1', sep=',', null='')
conn.commit()
csv文件如下 id为主键(更新时不要取列名)
插入表格的第一个 csv
id name
1 A
2 B
第二个csv
id name
1 C
3 O
4 P
最终更新和插入的表应该是
id name
1 C
2 B
3 O
4 P
由于 id 为 1 的第二个 csv 文件的名称为 C,因此必须更新表。
解决方案
尝试这个..
create table t1 (id integer,name character varying)
insert into t1
select 1,'A'
union all
select 2,'B'
create table t2 (id integer,name character varying)
insert into t2
select 1,'C'
union all
select 3,'O'
union all
select 4,'P'
SELECT * FROM t1
SELECT * FROM t2
select coalesce(t1.id,t2.id),case when t2.name is not null then t2.name else t1.name end as name
from t1
full join t2 on t2.id = t1.id
结果:
1;"C"
2;"B"
3;"O"
4;"P"
推荐阅读
- r - 为什么数据在 ggplot2 中带有错误栏的箱线图中错位
- python - 在循环逻辑内写入 CSV 文件 - Spark DF,Equal Splits
- typescript - 在打字稿测试中设置和维持环境变量
- python - 无法连接到 AWS ElastiCache 表单 python 客户端
- python - 一个开放的流对象正在被垃圾收集;称呼
- python-3.x - 我有五类音频,一个接一个地发生。是否可以模拟位于任何两个类之间的音频?
- python - PySpark:有效处理外键
- c++ - RapidJson - 如何构建 Json 对象?
- c# - 问:使用 dotNet 向 MongoDB 发送数据
- python - Pytorch_forecasting Temporal Fusion Transformer 在预测中返回 NAN,并且来自 trainer 对象的 best_model_path 为空