单条update
# 把主键是1的名字改为张三
db["ath"].update(1,{"name":"张三"}
看起来是不是很弱?是的。因为你得先找到主键。
如果是国家+编号的复合主键,还得改为
db["ath"].update(("中国队",1),{"name":"张三"}
貌似这是我能在文档里找到最有关联性的update内容了。
单条upsert
upsert是sqlite 3.24的新功能,sqlite-utils毫无悬念地对它也进行了改造,它的作用是,根据主键来,如果该主键存在,则修改内容,如果该主键不存在,就新增一条。这个方法和insert 是一致的
db["ath"].upsert({
"id": 1,
"name": "张三",
"age": 24,
}, pk="id")
多条upsert
它还有一个upsert_all,这个和insert_all用法一致。
db["ath1"].upsert_all([{
"id":1,
"name": "Azi",
"color": "blue",
"is_active":True,
}, {
"name": "Lila",
"color": "blue",
}, {
"name": "Suna",
"color": "gold",
}, {
"name": "Cardi",
"color": "black",
}],pk="id")
转换字段内容
在现在的数据库中,对列的操作都很平常了,在sql语句中相当于:
UPDATE table SET column = convert_value(column)
这里采用convert来完成。
# 将所有姓名大写
db["ath"].convert("name", lambda value: value.upper())
# 将姓名和队名大写
db["ath"].convert(["name", "team"], lambda value: value.upper())
# 将姓名大写后,存入新的字段
db["ath"].convert("name", lambda value: value.upper(), output="name_upper")
# 将姓名分别大小写后,存入upper和lower两个字段
db["ath"].convert(
"name", lambda v: {"upper": v.upper(), "lower": v.lower()}, multi=True
)
但是很神奇,在转换字段时,支持where
db["ath"].convert("title", lambda v: v.upper(), where="id > :id", where_args={"id": 20})
因为covert不是依据主键来的,所以,它可以直接象row_where一样,进行条件替换。
批量update,也就是update…where
开始,我一直盯着update…where来找怎样批量修改数据,直到最后发现,思路错了,直接用上一个convert方法不就可以了吗?方法很简单,随便举个例子。
db["ath"].convert("state", lambda v: "退休", where="age > 60")