跳转至

更新

save

你可以在修改模型的字段后,调用模型的 save 来让修改结果更新到数据库中:

1
2
3
4
    user = await User(name="Paimon", age=18, birthday=date(2020, 6, 1)).insert()
    user.age += 1
    user.birthday = date(2022, 6, 1)
    await user.save()
有则更新无则插入

save 也可以用于插入,当模型的主键已经存在数据库中时,则会更新,否则会插入该模型。

update

或者使用 update 方法,传入要更新的值来更新:

    await user.update(age=21, birthday=date(2023, 6, 1))

update_or_create

使用 update_or_create,如果数据库中存在该模型,则更新,否则插入。

返回值类型为 Tuple[Model, bool],第一个值为模型实例,第二个值是 bool 类型,True 表示更新了模型实例,False 表示创建了模型实例。

1
2
3
4
    user, is_update = await User.update_or_create(
        User.name == "Paimon",
        defaults={"age": 18, "birthday": date(2020, 6, 1)},
    )

它接受若干的查询条件,以及一个类型为 Dict[str, Any]defaults 参数,用于指定要更新的字段及其值。

首先会根据查询条件查询指定数据,如果存在,则使用 defaults 字典里的数据来更新它,否则,会使用查询条件和 defaults 字典里的数据来创建一个新的模型并返回。

save_many

使用模型类的 save_many 来同时更新多条数据:

1
2
3
4
5
6
7
8
    user1 = await User(name="user 1").insert()
    user2 = await User(name="user 2").insert()
    user3 = await User(name="user 3").insert()

    user1.name = "user 1 updated"
    user2.age += 3
    user3.birthday = date(2024, 6, 1)
    await User.save_many(user1, user2, user3)

完整代码

本章完整示例代码
from datetime import date

import cherry

db = cherry.Database("sqlite+aiosqlite:///:memory:")


class User(cherry.Model):
    id: cherry.AutoIntPK = None
    name: str
    age: int = 18
    birthday: date = cherry.Field(default_factory=date.today)

    cherry_config = cherry.CherryConfig(tablename="user", database=db)


async def main():
    await db.init()

    user = await User(name="Paimon", age=18, birthday=date(2020, 6, 1)).insert()
    user.age += 1
    user.birthday = date(2022, 6, 1)
    await user.save()

    await user.update(age=21, birthday=date(2023, 6, 1))

    user, is_update = await User.update_or_create(
        User.name == "Paimon",
        defaults={"age": 18, "birthday": date(2020, 6, 1)},
    )

    user1 = await User(name="user 1").insert()
    user2 = await User(name="user 2").insert()
    user3 = await User(name="user 3").insert()

    user1.name = "user 1 updated"
    user2.age += 3
    user3.birthday = date(2024, 6, 1)
    await User.save_many(user1, user2, user3)


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())