python peewee 仅更新插入字典指定字段

问题描述 投票:0回答:1

我是 peewee (

v3.17
) 的新手 - 与 sqlite(
v3.40
) 一起使用,尝试编写一个函数来更新或插入数据到我的用户表, 这是模型类

class MyUser(Model):
    id = AutoField()
    user_mail = TextField(unique=True)
    username_a = TextField(null=True)
    user_id_a = TextField(null=True)
    username_b = TextField(null=True)
    user_id_b = TextField(null=True)

    class Meta:
        table_name = 'my_user'
        database = db

这是我用来添加或更新数据的功能。 参考

def upsert_user(**user_data):
    """Insert / update given data to user table"""

    return (MyUser
            .insert(**user_data)
            .on_conflict(
                conflict_target=[MyUser.user_mail],
                preserve=[MyUser.username_a,
                            MyUser.user_id_a,
                            MyUser.username_b,
                            MyUser.user_id_b])
            .execute())

这些是我的样本数据。

data0 = {
    "user_mail": "[email protected]",
    "username_a": "user1_a",
    "user_id_a": "a1",
    "username_b": "user1_b",
    "user_id_b": "b1"
}

upsert_user(**data0)

data1 = {
    "user_mail": "[email protected]",
    "username_a": "user1_a_new",
    "user_id_a": "a1_new"
}

upsert_user(**data1)

预计仅

username_a
user_id_a
列得到更新,保留其他列, 但其他列在函数调用后得到 null(默认值)。

我已将所有其他列名称添加到

preserve
,因为我还需要这些才能工作,

data2 = {
    "user_mail": "[email protected]",
    "username_b": "user1_b_new",
    "user_id_b": "b1_new"
}

# only update the mentioned colums

data3 = {
    "user_mail": "[email protected]",
    "username_a": "user2_a",
    "user_id_a": "a2"
}

# Add new row 

如何实现仅更新/插入提到的字典列。

python sqlite peewee
1个回答
0
投票

你不想要

preserve
那么,你想要
update
,例如:

def upsert_user(**user_data):
    """Insert / update given data to user table"""

    return (MyUser
            .insert(**user_data)
            .on_conflict(
                conflict_target=[MyUser.user_mail],
                update=user_data)
            .execute())
© www.soinside.com 2019 - 2024. All rights reserved.