ORM框架Peewee(四改)

ORM框架Peewee(一模型)根据表生成model,根据model生成表
ORM框架Peewee(二增)
ORM框架Peewee(三删)
ORM框架Peewee(四改)
ORM框架Peewee(五查)
ORM框架Peewee六(连接池、主从、重连、ssh连接)
ORM框架Peewee七《INSERT 和 UPDATE扩展》
ORM框架 Peewee 如何使用Mysql的JSON特性?

三、修改

1、save

save() 方法可以插入一条记录,一旦模型实例具有主键,
任何后续调用 save() 都将导致 UPDATE 而不是另一个 INSERT

p = Person(Name='王五', Age=17, Birthday=date(1998, 01, 01))
p.save()			

p.Remarks = 'abc'
p.save()	

第一次saveINSERT,第二次是 UPDATE
在执行第一个 save() 方法的时候,主键没值,所以执行 INSERTsave() 方法执行之后,自增列的值就返回并赋给了模型实例,所以第二次调用 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 操作。如指定键存在就更新,如不存在执行插入

无论以前是否存在过,存在更新,不存在则插入 replaceon_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,

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风华浪浪

讨个老婆本呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值