zoukankan      html  css  js  c++  java
  • sqlalchemy批量插入数据(性能问题)

    简介

    在某些场景下,我们需要在一瞬间插入大量数据的情况下,我们要使用一些性能比较好的方式来插入数据,这样才能保证接口的时间。下面测试的数据是1.6W条数据的时间。

    sqlalchemy批量插入数据

    方式一:

        @staticmethod
        def save_data(data, pg_con=None):
            try:
                pg_con = pg_con if pg_con else g.pg_db
                for i in data:
                    loophole = Loophole(**i)
                    pg_con.add(loophole)
                pg_con.commit()
                return True
            except Exception, e:
                logging.error('class path: %s;function name: %s;error message:%s' % (
                    __name__, sys._getframe().f_code.co_name, e.message), exc_info=True)
    pg_con.rollback()
    return False

    注:此方式是最慢的

    方式二:

        @staticmethod
        def save_data(data, pg_con=None):
            try:
                pg_con = pg_con if pg_con else g.pg_db
                loopholes = list()
                for i in data:
                    loopholes.append(Loophole(**i))
                pg_con.bulk_save_objects(loopholes)
                pg_con.commit()
                return True
            except Exception, e:
                logging.error('class path: %s;function name: %s;error message:%s' % (
                    __name__, sys._getframe().f_code.co_name, e.message), exc_info=True)
    pg_con.rollback()
    return False

    注:如果在数据量超大的时候 ,我们可以在每 1000 条的时候 bulk_save_objects 一次。

     方式三:

        @staticmethod
        def save_data(data, pg_con=None):
            try:
                pg_con = pg_con if pg_con else g.pg_db
                pg_con.bulk_insert_mappings(Loophole, data)
                pg_con.commit()
                return True
            except Exception, e:
                logging.error('class path: %s;function name: %s;error message:%s' % (
                    __name__, sys._getframe().f_code.co_name, e.message), exc_info=True)
                pg_con.rollback()
                return False

    方式四:

        @staticmethod
        def save_data(data, pg_con=None):
            try:
                pg_con = pg_con if pg_con else g.pg_db
                pg_con.execute(
                    Loophole.__table__.insert(),
                    data
                )
                pg_con.commit()
                return True
            except Exception, e:
                logging.error('class path: %s;function name: %s;error message:%s' % (
                    __name__, sys._getframe().f_code.co_name, e.message), exc_info=True)
                pg_con.rollback()
                return False
  • 相关阅读:
    [C++][编程风格]C++命名规则
    [Android]搜索关键字飞入飞出效果 (转)
    android,性能优化,内存优化管理,高级缓存 (转)
    Java内存泄露原因详解
    Java之线程(2) 调时器
    Java之线程(1) 传统线程机制的回顾
    Hibernate(1) 阻抗不匹配
    No4.传统线程同步通信技术
    Android内存溢出
    MAT Memory Analyzer Tool 插件装配(图解)(转)
  • 原文地址:https://www.cnblogs.com/shangwei/p/14430930.html
Copyright © 2011-2022 走看看