版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
三、修改
1、save
save()
方法可以插入一条记录,一旦模型实例具有主键,
任何后续调用 save()
都将导致 UPDATE
而不是另一个 INSERT
p = Person(Name='王五', Age=17, Birthday=date(1998, 01, 01))
p.save()
p.Remarks = 'abc'
p.save()
第一次save 是 INSERT
,第二次是 UPDATE
在执行第一个 save()
方法的时候,主键没值,所以执行 INSERT
,save()
方法执行之后,自增列的值就返回并赋给了模型实例,所以第二次调用 save()
执行的是 UPDATE
。
模型中如没有指定主键,peewee 会自动增加一个名为 id 的自增列作为主键。
2、update
**update 用于批量更新,方法相对简单,以下三种写法都可以
peewee的update是原子的(Atomic )
# 方法一
Person.update({Person.Name: '赵六', Person.Remarks: 'abc'}).where(Person.Name=='王五').execute()
# 方法二
Person.update({'Name': '赵六', 'Remarks': 'abc'}).where(Person.Name=='张三').execute()
# 方法三
Person.update(Name='赵六', Remarks='abc').where(Person.Name=='李四').execute()
3、原子更新
subquery = Tweet.select(fn.COUNT(Tweet.id)).where(Tweet.user == User.id)
update = User.update(num_tweets=subquery)
update.execute()
upsert 操作。如指定键存在就更新,如不存在执行插入
无论以前是否存在过,存在更新,不存在则插入 replace
与on_conflict_replace()
是等效的
last_login值将更新,
user_id = User.replace(username='the-user', last_login=datetime.now()).execute())
user_id = User.insert(username='the-user', last_login=datetime.now()).on_conflict_replace().execute())
另外 mysql 还提供了一种独有的语法 ON DUPLICATE KEY UPDATE
可以使用以下方法实现。
class User(Model):
username = TextField(unique=True)
last_login = DateTimeField(null=True)
login_count = IntegerField()
#插入一个新用户
User.create(username='huey', login_count=0)
# 模拟用户登录.
登录计数和时间戳,要么正确创建,要么更新。
now = datetime.now()
rowid = User.insert(username='huey', last_login=now, login_count=1)
.on_conflict(preserve=[User.last_login], # 使用我们将插入的值
.update={User.login_count: User.login_count + 1}
).execute()
我们可以用 update 方法来实现。
today = datetime.today()
query = Tweet.update(is_published=True).where(Tweet.creation_date < today)
query.execute() # Returns the number of rows that were updated.
4
https://juejin.im/post/5c75ee5a6fb9a049ad77b6f7#heading-12
https://www.cnblogs.com/piperck/p/9194311.html
谢谢大佬