6

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

編集:

値はによって生成されます

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

次に、行がであり、イテレータがから来る一度に1000個のリストを読み込みますcsv.DictReader

4

2 に答える 2

8

振り返ってみると、これは本当にばかげていましたが、間違いを見つけるのは困難でした。値は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()
于 2009-06-16T14:54:47.840 に答える
3

表示されるメッセージは、executemany()メソッド内で変換の1つが失敗したことを示しています。values3より長いタプルがないかリストを確認してください。

迅速な検証のために:

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]
于 2009-06-10T11:02:20.623 に答える