Python + MySQLdb выполнить много

Я использую Python и его модуль MySQLdb для импорта некоторых данных измерений в базу данных Mysql. Объем данных, которые у нас есть, довольно велик (в настоящее время около ~ 250 МБ CSV-файлов и еще много впереди).

В настоящее время я использую cursor.execute(...) для импорта некоторых метаданных. Это не проблематично, так как для них существует всего несколько записей.

Проблема в том, что когда я пытаюсь использовать cursor.executemany() для импорта большего количества фактических данных измерений, MySQLdb вызывает ошибку

TypeError: not all arguments converted during string formatting

Мой текущий код

def __insert_values(self, values):
    cursor = self.connection.cursor()
    cursor.executemany("""
        insert into values (ensg, value, sampleid)
        values (%s, %s, %s)""", values)
    cursor.close()

где values — список кортежей, каждый из которых содержит три строки. Любые идеи, что может быть не так с этим?

Изменить:

Значения генерируются

yield (prefix + row['id'], row['value'], sample_id)

а затем читать в список по одной тысяче за раз, где строка и итератор исходят из csv.DictReader.


person lhahne    schedule 10.06.2009    source источник
comment
Вы проверили, что values ​​содержат правильные данные? Кроме того, вы должны посмотреть на использование LOAD LOCAL DATA INFILE. Это может быть намного быстрее.   -  person brian-brazil    schedule 10.06.2009
comment
Проблема в том, что данные должны быть предварительно обработаны (что в настоящее время выполняется в том же скрипте Python), и создание избыточных копий таких больших наборов данных не очень целесообразно. Значения должны быть в порядке, я проверил это с помощью отладчика.   -  person lhahne    schedule 10.06.2009


Ответы (2)


В ретроспективе это была действительно глупая, но трудно замечаемая ошибка. Значения — это ключевое слово в sql, поэтому значения имени таблицы должны заключаться в кавычки.

def __insert_values(self, values):
    cursor = self.connection.cursor()
    cursor.executemany("""
        insert into `values` (ensg, value, sampleid)
        values (%s, %s, %s)""", values)
    cursor.close()
person lhahne    schedule 16.06.2009

Полученное сообщение указывает на то, что внутри метода executemany() произошла ошибка одного из преобразований. Проверьте свой список values на наличие кортежа длиннее 3.

Для быстрой проверки:

max(map(len, values))

Если результат выше 3, найдите плохой кортеж с помощью фильтра:

[t for t in values if len(t) != 3]

или, если вам нужен индекс:

[(i,t) for i,t in enumerate(values) if len(t) != 3]
person gimel    schedule 10.06.2009
comment
Спасибо, но это не проблема. Все кортежи имеют правильную длину. - person lhahne; 10.06.2009