三、修改
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()
Person.update(Person.age=Person.age+1).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
谢谢大佬
mysql 有一个特性的存储 ON DUPLICATE KEY UPDATE,有就update,没有就更新,当然如果你想忽略就不在更新的地方写东西不就行了,如果你想替换,就将所有的字段更新一遍
关于如何使用,什么例子都不如官网
peewee框架对该语句的支持
on_conflict 可以配置重复就更新
on_conflict_ignore 配置重复就忽略
on_conflict_replace 配置重复就替换
测试
9000行数据去重 800ms
44000行数据1-2s,
版权声明:本文为a6864657原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。