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
  • 相关阅读:
    第一章 数据集散地:数据库
    第六章 使用ADO.NET查询和操作数据
    第五章 使用ADO.NET访问数据库
    第四章 深入C#的String类
    IOS框架和服务
    一步步调试解决iOS内存泄漏
    app跳转
    iOS 视频直播
    学习心得
    iOS中FMDB的使用
  • 原文地址:https://www.cnblogs.com/shangwei/p/14430930.html
Copyright © 2011-2022 走看看