Postgresql UPSERT while encrypting column by python encryption

l7wslrjt  于 2023-04-20  发布在  PostgreSQL
关注(0)|答案(1)|浏览(89)

我使用BULK UPSERT将记录插入到新表中,而列的数据正在通过Python lib CryptoDome加密。下面是我所做的

def bulk_upsert_query(data, table_name=None):
    values_list = []
    add = values_list.append

    for i in data:
        encrypt_user_id = encryption_fnc(str(i.user_id))

        add(f"({i.id},'{encrypt_user_id}','{i.name}')")

    upsert_sql = r"""insert into upsert_test_table 
                    (id,encrypt_user_id,name)
                   values
                   """ + "\n, ".join(values_list) + """ ON CONFLICT ON CONSTRAINT 
                  "upsert_test_table_pkey"
                   DO UPDATE SET
                   name=excluded.name,
                   encrypt_user_id=excluded.user_id"""
    return upsert_sql

data =我的旧表中的数据,其中 user_id 为int(例如:124,345,786)in upsert_test_table table id column is primary key column. this bulk_upsert_query fnc will encrypt int user_id and append to values_list then create a upsert query.
根据插入,它的工作原理与我预期的一样,但是当它与id列发生冲突时进行更新,然后正如你所看到的,我为 user_id 列设置了encrypt_user_id=excluded.user_id,它使用int user_id(来自旧表)更新现有的加密 user_id,因为我没有在这里放置任何加密fnc,更新:user_id列是可变的
所以我想要的是我想在DO UPDATE SET部分调用我的encryption_fnc,当它更新时,我还想做加密。
谁能告诉我,谁能做到这一点?

注意:我可以用pgcrypto在数据库站点加密,但我的要求是在python端加密,而不是数据库端。

iyr7buue

iyr7buue1#

解决:对不起,我很愚蠢,我认为excluded表是原始(输入有效负载)表,但当我用excluded.encrypt_user_id替换excluded.user_id时,它工作了,尽管不知道排除的表是如何工作的。

相关问题