Я анализирую текстовый файл и затем обновляю столбец таблицы mysql значениями, проанализированными из файла на основе первичного ключа в этой таблице.Сначала я использовал sqlite для этого и писал в локальный файл sqlite, где я не столкнулся с какими-либо проблемами.Сейчас я пишу в новую базу данных mysql, и при использовании executemany для обновления таблицы с большими списками, анализируемыми из текстового файла, обновления занимают много времени, иногда 20-30 секунд, а в некоторых случаях, когда список содержит ~ 50 тыс. Записей, приложениеникогда ничего не пишет успешно.
Я пытался использовать executemany, так как при использовании sqlite это, казалось, уменьшило проблемы с производительностью, код перестанет работать, когда в вызове executemany будет использован достаточно большой список.Из того, что я прочитал, я должен использовать executemany с INSERT и ON DUPLICATE KEY UPDATE, но это приводит к усеченной ошибке данных.
def strip_file(x):
filePath = 'somefile.txt'
with open(filePath) as file:
for i, line in enumerate(file):
if i > x:
indicatorName = re.findall(re.escape('some text')+"(.*?)"+re.escape("blah"),line)
if indicatorName:
indicatorCount = re.findall(re.escape('number')+"(.*?)"+re.escape("|"),line)
indicatorTime = re.findall(re.escape('time')+"(.*?)"+re.escape('end'),line)
for i in indicatorTime:
i.strip()
indicatorName = re.findall(re.escape('ending' + indicatorCount[0] +'|')+"(.*?)"+re.escape('|'),line)
indicatorNameInd = indicatorName[0].split(",")
indicatorNameInd = filter(None, indicatorNameInd)
for i in indicatorNameInd:
i.strip()
indicatorTimeSeq = [indicatorTime]*len(indicatorNameInd)
indicatorTimeList = list(chain(*indicatorTimeSeq))
indicatorSeq = zip(indicatorTimeList, indicatorNameInd)
cursor.execute('SET autocommit=0')
sql = 'UPDATE IndicatorData SET IndicatorTime=%s WHERE IndicatorID=%s'
cursor.executemany(sql, indicatorSeq)
conn.commit()
Этот подход прекратит запись, если индикатор seq велик.
Использование INSERT ON DUPLICATE KEY UPDATE:
sql = 'INSERT INTO IndicatorData (IndID, IndTime) VALUES (%s,%s) ON DUPLICATE KEY UPDATE VALUES IndTime = %s'
cursor.executemany(sql, indicatorSeq)
Я ожидаю обновления IndTime в таблице, если в столбце IndID присутствует индикатор IndicatorID, связанный с этим списком.Вместо этого я получаю эту ошибку:
ProgrammingError: Ошибка обработки параметров формата;Python 'кортеж' не может быть преобразован в тип MySQL