仅保留特定行psycopg2

时间:2018-06-18 12:27:37

标签: python python-3.x postgresql psycopg2

我有一个包含这样的工作的表

id   owner          collaborator    privilege 
90  "919886297050"  "919886212378"  "read"
90  "919886297050"  "919886297052"  "read"
88  "919886297050"  "919886212378"  "read"
88  "919886297050"  "919886297052"  "read"

主键是id,所有者和协作者的组合 我想传递我想要保留的合作者的详细信息。例如,如果我的合作者=" 919886212378"这意味着我想删除" 919886297052"并保留" 919886212378"

的行

有没有办法在一个查询/执行中执行此操作,而不是单独获取详细信息,然后在过滤缺失值后执行删除?

编辑:我的用例可能会添加新的协作者并删除旧的协作者。但是,我的输入只会包含一组选定的协作者,因此我需要与旧列表进行交叉检查,保留现有内容,添加新内容并删除缺少的协作者。

2 个答案:

答案 0 :(得分:1)

DELETE FROM table WHERE collaborator NOT IN ("919886212378", "id ..")

对您提到的具体案例进行删除。但我不知道 你如何得到这些id。您提供的确切案例信息太少。 如果您可以通过查询获取这些ID,则可以将其设为子查询,如:

DELETE FROM table WHERE collaborator NOT IN (SELECT ... FROM ...)

答案 1 :(得分:0)

比较python中的新旧协作者列表对我来说是成功的秘诀

    original_list = ["C1","C2","C3","C4"] // result from query
    updated_list= ["C1","C6","C7"] // list obtained from request


    # compute the differences   
    to_be_added  = set(updated_list).difference(set(original_list) )
    to_be_deleted  = set(original_list).difference(set(updated_list) )

然后,我使用上面的两个列表在事务内使用插入和删除语句进行更新。