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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM