Значения не вставляются в таблицу MySQL с помощью pool.apply_async в python2.7
Я пытаюсь запустить следующий код для параллельного заполнения таблицы для определенного приложения. Сначала определяется следующая функция, которая должна подключаться к моей базе данных и выполнять команду sql с указанными значениями (для вставки в таблицу).
def dbWriter(sql, rows) :
# load cnf file
MYSQL_CNF = os.path.abspath('.') + '/mysql.cnf'
conn = MySQLdb.connect(db='dedupe',
charset='utf8',
read_default_file = MYSQL_CNF)
cursor = conn.cursor()
cursor.executemany(sql, rows)
conn.commit()
cursor.close()
conn.close()
И тогда есть этот кусок:
pool = dedupe.backport.Pool(processes=2)
done = False
while not done :
chunks = (list(itertools.islice(b_data, step)) for step in
[step_size]*100)
results = []
for chunk in chunks :
print len(chunk)
results.append(pool.apply_async(dbWriter,
("INSERT INTO blocking_map VALUES (%s, %s)",
chunk)))
for r in results :
r.wait()
if len(chunk) < step_size :
done = True
pool.close()
Все работает и ошибок нет. Но в конце моя таблица пуста, что означает, что вставки были неудачными. Я пробовал так много вещей, чтобы исправить это (включая добавление имен столбцов для вставки) после многих поисков в Google и не увенчались успехом. Мы ценим любые предложения. (запуск кода на python2.7, gcloud (ubuntu). обратите внимание, что отступы могут быть немного испорчены после вставки здесь)
Также обратите внимание, что "чанк" точно соответствует требуемому формату данных.
Заметка. Это часть этого примера. Обратите внимание, что единственное, что я изменяю в приведенном выше примере (связан), - это то, что я разделяю шаги по созданию и вставке в таблицы, так как я запускаю свой код на платформе gcloud и он применяет GTID стандарты.
1 ответ
Решением было изменение функции dbwriter на:
conn = MySQLdb.connect(host = # host ip,
user = # username,
passwd = # password,
db = 'dedupe')
cursor = conn.cursor()
cursor.executemany(sql, rows)
cursor.close()
conn.commit()
conn.close()