实施批插入提高性能

2024-06-01 02:49:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了下面的代码来将数据插入到MEMSql中,MEMSql的语法与MySQL类似。在

def get_connection(db=DATABASE):
    """ Returns a new connection to the database. """
    return database.connect(host=HOST, port=PORT, user=USER, password=PASSWORD, database=db)



def insert_data(data):
    print 'inserting data...'

    for item in data:
        vars_to_sql = []
        keys_to_sql = []
        print(item)
        for key,value in item.iteritems():
             if key == '__osHeaders':
                value = str(value)
             if isinstance(value, unicode):
                vars_to_sql.append(value.encode('ascii', 'ignore'))
                keys_to_sql.append(key.encode('ascii', 'ignore'))
             else:
                vars_to_sql.append(value)
                keys_to_sql.append(key)

        keys_to_sql = ', '.join(keys_to_sql)
        with get_connection() as conn:

             c = conn.execute("INSERT INTO tablename (%s) VALUES %r" % (keys_to_sql,  tuple(vars_to_sql),))
             print c

字段名不能硬编码,因为它们可能会根据我从另一端获得的数据而更改。不管怎样,我在这里重复的是一本字典。由于这一次插入非常慢,我需要将batch size作为变量,形成查询语句并相应地插入它。因此,批量大小为2的查询将是INSERT INTO tablename col1, col2 VALUES ('a', 'b'),('c','d')

请帮我介绍一下。在


Tags: to数据keysqldatavaluedefvars
2条回答

如果您使用的是memsqlpython库,那么可以使用memsql.common.query_builder包中提供的multi_insert助手。例如:

from memsql.common.query_builder import multi_insert
from memsql.common.database import connect

sql, params = multi_insert("my_table", { "foo": 1 }, { "foo": 2 })
# sql = 'INSERT INTO `my_table` (`foo`) VALUES (%(_QB_ROW_0)s), (%(_QB_ROW_1)s)'
# params = {'_QB_ROW_0': [1], '_QB_ROW_1': [2]}

with connect(...) as conn:
    conn.execute(sql, **params)

请注意,multi_insert要求每个记录定义相同的列集,因为它将其转换为查询的基于元组的插入。在

以下答案可能对您有帮助:https://stackoverflow.com/a/8777776/3207406

  1. 可以有一个元组,其中包含在某个时刻可能使用的所有列
  2. 创建一个元组列表,其中包含要插入的实际值,默认值为^{}
  3. 然后bulk-insert他们

相关问题 更多 >