2009-06-10 13 views
5

私は、PythonとそのMySQLdbモジュールを使用して、測定データをMysqlデータベースにインポートしています。私たちが持っているデータの量はかなり高いです(現在、約250 MBの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は、それぞれ3つの文字列を含むタプルのリストです。どのようなアイデアがこれに間違っているのでしょうか?

編集:

値は

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

によって生成され、その行であり、イテレータがcsv.DictReaderから来る時にリスト千に読み込まれます。

+1

値に正しいデータが含まれていることを確認しましたか? さて、LOAD LOCAL DATA INFILEを使用して見てください。それはずっと速くなることができます。 –

+0

問題は、データを前処理する必要があることです(これは現在同じPythonスクリプトで実行されています)。そのような大きなデータセットの冗長コピーを作成することはあまり実行可能ではありません。 デバッガで確認したので、値はokです。 – lhahne

答えて

7

回顧的には、これは本当に愚かなbuでした間違いを見つけにくい。値は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()メソッドの中で、変換の1つが失敗したことを示します。迅速な検証のために長い3

よりタプルのためのあなたのvaluesリストを確認してください:

max(map(len, values)) 

結果が3以上である場合には、フィルタを使用して悪いタプルを探します

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

または、インデックスが必要な場合:

+0

ありがとうございますが、それは問題ではありません。すべてのタプルの長さが正しい。 – lhahne

+0

さて、あなたのフォーマットが%sの正しい数を持っていることを確認してください... – gimel