首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wonder1z
V2EX  ›  Django

Django ORM 如何实现 bulk_update_or_create

  •  
  •   wonder1z · 47 天前 · 1424 次点击
    这是一个创建于 47 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    16 回复  |  直到 2019-12-12 10:47:14 +08:00
    hmxxmh
        1
    hmxxmh   47 天前
    for 循环 + update_or_create
    wonder1z
        2
    wonder1z   47 天前
    @hmxxmh 数据量大的话 效率太低了
    est
        3
    est   47 天前
    ORM 再厉害也没法实现 sql 支持不了的事。建议直接撸 insert ... on duplicate update ...
    wonder1z
        4
    wonder1z   47 天前
    @est ORM 支持 update_or_create 的 只不过没有批量的 bulk_update_or_create。单条撸性能太差了
    hmxxmh
        5
    hmxxmh   47 天前
    @est 同意,orm 就是对 sql 的一层封装,真要追求效率直接撸 sql 比较好
    hmxxmh
        6
    hmxxmh   47 天前
    @wonder1z 平时只用 bulk_create,刚才查了一圈,没有看到 bulk_update_or_create。。。数据量有多大?
    Ehco1996
        7
    Ehco1996   47 天前
    @wonder1z

    bulk_create 的本质其实是 insert many

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

    我觉得比较简单的是分成两步 然后外面套事务
    * bulk_create
    * bulk_update
    wonder1z
        8
    wonder1z   47 天前
    @hmxxmh 上千条
    ytymf
        9
    ytymf   47 天前
    @wonder1z 貌似只能循环了,with transaction.atomic 包裹一下,性能还有问题么
    wonder1z
        10
    wonder1z   47 天前
    @ytymf 回头我试试
    wonder1z
        11
    wonder1z   47 天前
    @Ehco1996 这样更复杂了吧
    hmxxmh
        12
    hmxxmh   47 天前
    @ytymf with transaction.atomic 只是进入事务,异常统一回滚,不能提升性能,其实我觉得一下创建上千条,肯定慢,放到 celery 里面让他慢慢跑吧
    ytymf
        13
    ytymf   47 天前
    @hmxxmh 你说的没错,这个原意只是保证原子性的事务提交。但在 django 实践中,确实比循环中的每次隐式事务提交快非常多,试试就知道了。
    ytymf
        14
    ytymf   47 天前
    @hmxxmh 具体的原因,猜测是是 model.save 应该会每次建立断开数据库连接,显式事务中 commit 后才断开。没有具体求证过
    hmxxmh
        15
    hmxxmh   47 天前 via Android
    @ytymf 这倒是没注意过😄,下次试一下
    encro
        16
    encro   46 天前
    @hmxxmh
    @ytymf
    Mysql 中一次插入大量数据,采用事务能明显提升性能,这个是事实,
    和 model 没有关系,直接用 sql 也是一样性能差距明显,(一次几十万条数据就能测试出来,我们有时候做性能测试需要一次生成大量数据都是采用事务或者 prepare,原来干几十分钟的,几分钟就行了)
    猜测应该日志配置,索引,寻址有关,
    比如每条记录写一次日志然后确认,与一次性写入一批日志,然后确认。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   757 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 21:34 · PVG 05:34 · LAX 13:34 · JFK 16:34
    ♥ Do have faith in what you're doing.