2009-06-10 39 views
5

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

В настоящее время я использую 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 - это список кортежей, содержащих по три строки. Любые идеи, что может быть неправильно с этим?

Edit:

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

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

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

+1

Вы подтвердили, что значения содержат правильные данные? Как в стороне, вы должны посмотреть на использование LOAD LOCAL DATA INFILE. Это может быть намного быстрее. –

+0

Проблема заключается в том, что данные должны быть предварительно обработаны (что в настоящее время выполняется в одном и том же сценарии python), и не очень эффективно создавать избыточные копии таких больших наборов данных. Значения должны быть в порядке, когда я проверил это с помощью отладчика. – lhahne

ответ

7

В ретроспективе это было действительно глупое бу Трудно заметить ошибку. Значения - это ключевое слово в 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() 
3

Сообщение, которое вы получаете, указывает, что внутри метода 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] 
+0

Спасибо, но это не проблема. Все кортежи имеют правильную длину. – lhahne

+0

Ну, теперь проверьте, что ваш формат имеет правильное количество% s ... – gimel

Смежные вопросы