使用DataFrame中的数据更新postgresql表

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

select d.id,min(start),max(end),sum(isnull(t.col1,0.00)) 
from DateRange d
left join transactions t on 1=1 and t.dateime between d.start and d.end
group by d.id

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

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

basedata:

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

逻辑选择应该是:

new_data:

id,height
17,harry,26,177
23,mary,14,145
2,25,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,165 17,145 python

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

cctt1233 回答:使用DataFrame中的数据更新postgresql表

您可以在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,height)
VALUES
   (17,'harry',26,177),(23,'mary',14,145),25,165)
ON CONFLICT (id)
DO NOTHING;

更多说明:-PostgreSQL Upsert Using INSERT ON CONFLICT statement

,

使用sqlalchemy,并假设数据帧为new_data,流程如下:

from sqlalchemy import create_engine
engine = create_engine(my_postgresql_db_uri)
con = engine.connect()

table_name = 'basedata'

base_data = pd.read_sql(table_name,con)

data = pd.append(base_data,new_data,ignore_index=True).drop_duplicates()

data.to_sql(table_name,con,if_exists='replace')

这未经测试并且没有真正优化,因为每次更新表时都必须读取表,because在pandas.to_sql中不能有“ INSERT OR UPDATE”(插入或更新)

本文链接:https://www.f2er.com/3027755.html

大家都在问