sqlite-utils 3.36使用体会(四)更改(调整了多条update)

本文介绍了如何在SQLite数据库中使用`update`、`upsert`和`convert`方法进行单条和批量数据更新,包括多条upsert功能以及字段内容的转换,同时提到了如何结合`where`条件进行操作。
摘要由CSDN通过智能技术生成

单条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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值