Django ORM 如何实现 bulk_update_or_create

2019-12-11 10:05:43 +08:00
 wonder1z

如题,django 中貌似只有 bulk_update 和 bulk_create,有什么办法可以实现 bulk_update_or_create 吗

6772 次点击
所在节点    Django
18 条回复
hmxxmh
2019-12-11 10:14:34 +08:00
for 循环 + update_or_create
wonder1z
2019-12-11 10:17:26 +08:00
@hmxxmh 数据量大的话 效率太低了
est
2019-12-11 10:22:41 +08:00
ORM 再厉害也没法实现 sql 支持不了的事。建议直接撸 insert ... on duplicate update ...
wonder1z
2019-12-11 10:27:56 +08:00
@est ORM 支持 update_or_create 的 只不过没有批量的 bulk_update_or_create。单条撸性能太差了
hmxxmh
2019-12-11 10:28:38 +08:00
@est 同意,orm 就是对 sql 的一层封装,真要追求效率直接撸 sql 比较好
hmxxmh
2019-12-11 10:30:43 +08:00
@wonder1z 平时只用 bulk_create,刚才查了一圈,没有看到 bulk_update_or_create。。。数据量有多大?
Ehco1996
2019-12-11 10:40:50 +08:00
@wonder1z

bulk_create 的本质其实是 insert many

而你的需求是 update_or_create 貌似单条 sql 是做不到的 ( 我也不确定

我觉得比较简单的是分成两步 然后外面套事务
* bulk_create
* bulk_update
wonder1z
2019-12-11 10:55:45 +08:00
@hmxxmh 上千条
ytymf
2019-12-11 13:26:13 +08:00
@wonder1z 貌似只能循环了,with transaction.atomic 包裹一下,性能还有问题么
wonder1z
2019-12-11 16:31:46 +08:00
@ytymf 回头我试试
wonder1z
2019-12-11 16:33:04 +08:00
@Ehco1996 这样更复杂了吧
hmxxmh
2019-12-11 16:48:26 +08:00
@ytymf with transaction.atomic 只是进入事务,异常统一回滚,不能提升性能,其实我觉得一下创建上千条,肯定慢,放到 celery 里面让他慢慢跑吧
ytymf
2019-12-11 16:59:57 +08:00
@hmxxmh 你说的没错,这个原意只是保证原子性的事务提交。但在 django 实践中,确实比循环中的每次隐式事务提交快非常多,试试就知道了。
ytymf
2019-12-11 17:02:34 +08:00
@hmxxmh 具体的原因,猜测是是 model.save 应该会每次建立断开数据库连接,显式事务中 commit 后才断开。没有具体求证过
hmxxmh
2019-12-11 21:54:22 +08:00
@ytymf 这倒是没注意过😄,下次试一下
encro
2019-12-12 10:47:14 +08:00
@hmxxmh
@ytymf
Mysql 中一次插入大量数据,采用事务能明显提升性能,这个是事实,
和 model 没有关系,直接用 sql 也是一样性能差距明显,(一次几十万条数据就能测试出来,我们有时候做性能测试需要一次生成大量数据都是采用事务或者 prepare,原来干几十分钟的,几分钟就行了)
猜测应该日志配置,索引,寻址有关,
比如每条记录写一次日志然后确认,与一次性写入一批日志,然后确认。
0kaka
2020-03-01 13:24:17 +08:00
create( )
bnm965321
2020-03-12 10:23:50 +08:00
建议拆分成两个数据集合,先用 unique 字段查询哪些需要 update,然后拆分

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/627855

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX