Python + MySQLdb выполняет множество - PullRequest
5 голосов
/ 10 июня 2009

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

Edit:

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

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

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

Ответы [ 2 ]

7 голосов
/ 16 июня 2009

В ретроспективе это было действительно глупо, но трудно заметить ошибку. Values ​​- это ключевое слово в 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 голосов
/ 10 июня 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...