我使用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端加密,而不是数据库端。
1条答案
按热度按时间iyr7buue1#
解决:对不起,我很愚蠢,我认为
excluded
表是原始(输入有效负载)表,但当我用excluded.encrypt_user_id
替换excluded.user_id
时,它工作了,尽管不知道排除的表是如何工作的。