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#for循环——迭代法、穷举法
    C#循环语句
    C#算数运算符、关系运算符、逻辑运算符、语句
    C#visual2012基本操作、数据类型、类型转换
    C#进制转化
    Ajax用法
    《四》JAVA 字符输入输出流
    《三》Java IO 字节输入输出流
    《二》Java IO 流的分类介绍
    《一》File 类的介绍
  • 原文地址:https://www.cnblogs.com/shangwei/p/14430930.html
Copyright © 2011-2022 走看看