簡介
在某些場景下,我們需要在一瞬間插入大量數據的情況下,我們要使用一些性能比較好的方式來插入數據,這樣才能保證接口的時間。下面測試的數據是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