实现批量插入以提高性能
Implement batch insert to improve performance
我编写了以下代码将数据插入 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
字段名称不能硬编码,因为它们可能会根据我从另一端获得的数据而改变。无论如何它是我在这里迭代的字典。由于这种单次插入非常慢,我需要将批量大小作为一个变量,形成查询语句并相应地插入它。所以批量大小为 2 的查询将是 INSERT INTO tablename col1, col2 VALUES ('a', 'b'),('c','d')
这里请大家帮我介绍下如何介绍
以下回答可能对您有所帮助:
- 您可以有一个元组,其中包含可能在某个时候使用的所有列
- 创建一个包含您要插入的实际值的元组列表,默认值
DEFAULT
,
- 然后 bulk-insert 他们
如果您使用的是 MemSQL Python 库,您可以使用 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 要求每条记录都定义了相同的列集,因为它将其转换为基于元组的查询插入。
我编写了以下代码将数据插入 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
字段名称不能硬编码,因为它们可能会根据我从另一端获得的数据而改变。无论如何它是我在这里迭代的字典。由于这种单次插入非常慢,我需要将批量大小作为一个变量,形成查询语句并相应地插入它。所以批量大小为 2 的查询将是 INSERT INTO tablename col1, col2 VALUES ('a', 'b'),('c','d')
这里请大家帮我介绍下如何介绍
以下回答可能对您有所帮助:
- 您可以有一个元组,其中包含可能在某个时候使用的所有列
- 创建一个包含您要插入的实际值的元组列表,默认值
DEFAULT
, - 然后 bulk-insert 他们
如果您使用的是 MemSQL Python 库,您可以使用 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 要求每条记录都定义了相同的列集,因为它将其转换为基于元组的查询插入。