问题:需要解析为postgres数据库的电子表格集。插入是向前的。但是如果电子表格中的数据发生变化会怎么样呢。
因此,python3脚本会读取电子表格,它是变量(sheet1)和原始时间序列(sheet2)的混合。电子表格是灵活的数据收集,这就是原因。
然而,我似乎偶然发现电子表格中的数据不断变化。我使用的是postgresql 9.6,我知道怎么做UPSERT。
其中一个表格如下: | id | key_to_other_table |参数|值|
当表格中的key_to_other_table和参数不存在时,UPSERT工作正常。
问题是当参数最初在电子表格中并上传到数据库时,但在电子表格中已更正,但仍在数据库中。
我需要进行某种删除,但我不想直接删除所有行,然后只需重新插入,因为我使用了ID ...
我现在要进行一次获取,获取链接到某个电子表格的行的所有id,对这些值进行upsert,然后获取id。
比较两个列表,然后删除不再需要的列表。 但这似乎是三个不同的数据库查询...... 有一种优雅的方法可以一步到位吗?
答案 0 :(得分:0)
如果您使用某种"加载标识符"扩展表格。然后使用UPSERT填充,您可以删除表中没有您期望的负载标识符的任何记录。
一般流程:
示例演练:
初始设置。
扩展您的表格以添加load_id
列类型的varchar
。
ALTER TABLE myTable ADD load_id VARCHAR;
| id | key_to_other_table | parameter | value | load_id |
更新所有现有行以获得初始值。
`UPDATE myTable SET load_id = 'Existing Records';`
<强>载入强>
更改您的python脚本,以便在开始加载之前,它会提供一个唯一的load_id。像当前时间等等。
this_load_id = time.ctime()
在您的插入/ upsert中使用新的load_id
值填充this_load_id
列。
负载完成后。您插入或更新的每一行都有load_id = this_load_id
。
load_id
没有此值的任何行都来自较旧的负载,并且不在此电子表格中。
然后,您可以通过简单的删除
delete from myTable where load_id != this_load_id
警告:您可能希望在生产中使用比时间/日期字符串更高效的内容。