1

csv ファイルを解析し、MySQL テーブルの入力を生成するスクリプトに取り組んでいます。

csv.reader を介してデータをインポートするため、すべての行が文字列のリストになります。行を反復処理して、さまざまなエントリをデータベースに入れたいと考えています。

次のテストを実行できます。

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (1, 'entry1', 'entry2');"
cursor.execute (sql)

したがって、私のSQL接続は機能し、原則のSQL構文は問題ありません。そこに入れたいエントリにもアクセスできます。それらは正しく、期待するデータ型です。ただし、反復内の変数で同じ SQL 構文を使用できないようです。

allData = csv.reader(open('TestTable.csv', 'rb'), delimiter=',', quotechar='|')
for row in allData:
    sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (row[0], row[1], row[2]);"
    cursor.execute (sql)

これにより、構文エラーが生成されます。

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to our MySQL server version for the right syntax to use near '[0], row[1], row[2])' at line 1

しかし、データ型は正しく、SQL 構文は実際の例と同じです...

私が間違っていることと、それを機能させる方法を誰かに教えてもらえますか?

(最後に、純粋な csv エントリだけでなく派生値も挿入したいので、mysql 一括インポートだけを使用していません。)

よろしくお願いします。

4

2 に答える 2

3

使用する:

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (?, ?, ?);"
cursor.execute (sql, (row[0], row[1], row[2]))

疑問符はプレースホルダーです。プレースホルダーを使用することの追加の利点は、qoutes などをエスケープすることによって、入力が自動的に「安全」になることです。
現在、row[0], row[1], row[2]テキスト「row[0]、row[1]、row[2 ]"、これらの変数の値を使用するように python に指示する代わりに。


また、複数の長さの行を使用したい場合、または入力リストのサイズを簡単に変更できるようにしたい場合は、プレースホルダーを動的に作成できます。

sql = "INSERT INTO testSmall VALUES (%s);" % ', '.join('?' for _ in row)
cursor.execute (sql, row)
于 2012-06-22T12:51:15.270 に答える
2

あなたがやっている方法では、row[n]s は変数を参照しませんrowが、MySQL にそのまま送信される単なる文字列です。(あなたは PHP のバックグラウンドを持っており、二重引用符が変数をその値に置き換えることを期待しているに違いありません)。

これを実行して、文字列 (任意の文字列) 内に値を挿入できます。

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (%s, %s, %s);" % row # will map each %s to the `n`th element in `row`

(これは機能しません。注意してください。row[0] がabcの場合、その文字列は引用符で囲まれず、MySQL はそれを文字列として解釈しません)。sql 変数を印刷してみて、それをコピーして mysql プロンプトに貼り付け、動作するかどうかを確認してください。

ただし、MySQL で使用する場合は、次のようにエスケープすることをお勧めします。

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (%s, %s, %s);"
    cursor.execute(sql, row)

ドキュメントで詳細を読むことができます。

于 2012-06-22T12:53:45.363 に答える