我是 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
如何实现仅更新/插入提到的字典列。
你不想要
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())