更新
save
你可以在修改模型的字段后,调用模型的 save
来让修改结果更新到数据库中:
| 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
表示创建了模型实例。
| 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
来同时更新多条数据:
| 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())
|