2012-04-14 10 views
0

私はcommentsというフィールドを持っています。 大きなテーブルの値を複数のテーブルに読み込むのが効果的です。 したがって、私のselectクエリは私のためのコメントフィールドを取得します。PostgresでPythonで一重引用符を使用したinsert文の作成

私はテーブルからテーブルへのコピーを行うPythonスクリプトを構築しています。 一重引用符のため "申し訳ありませんがご注文を処理できません"のようなコメントフィールドが表示された場合、私の挿入クエリが失敗します。

私は$引用符を使用してみましたが、ここで無駄

に私は

#!/usr/bin/python 

import psycopg2 

conn = psycopg2.connect("dbname='postgres' user='postgres' host='localhost') 
mark=conn.cursor() 
/* fectching the rows and doing other stuff */ 

addthis="insert into my_table(something) values("$$"+str(row[8])+"$$") 
mark.execute(addthis) 
conn.commit() 

をしようとしています何でいるの助けに感謝します!

+2

最新のデータベースチュートリアルを見つける必要があります。あなたの現在の状況が悪い場合には、新しいデータベースチュートリアルを見つける必要があります。 –

+0

Ignacio Vazquez-Abrams:私には選択肢がありません!他の回避策がありますか? –

+5

はい。 DB-API 2は、使用するために使用します。チュートリアルを参照してください。 –

答えて

6
  1. 挿入ステートメントにはプレースホルダを使用する必要があります。 psycopg2の場合、それは%sです。
  2. ​​に2番目の引数としてパラメータを渡す必要があります。そうすれば、引用の問題はなく、SQLインジェクション攻撃から守ることができます。たとえば、

addthis = "INSERT INTO my_table (something) VALUES (%s);" 
mark.execute(addthis, ('a string you wish to insert',)) 
+0

bernie:ありがとうございました! –

-3

バーニーにより示唆されるようにあなたが、プレースホルダを使用することができます。 これが好ましい方法です。
ただし、プレースホルダの使用が不可能な状況があります。その後、qoutesを手動でエスケープする必要があります。

addthis="insert into my_table(something) values(%s)" % str(row[8]).replace('"', r'\"').replace("'", r"\'") 
mark.execute(addthis) 
+1

いいえ - プレースホルダを使用する必要があります。このような質問をしているなら、あなたがすべき最後のことは、あなた自身のアドホックエスケープをまとめることです。あなたはとにかく働かない。 –

+0

はい。プレースホルダーがそれを行う正しい方法でした。 –

関連する問題