2012-02-19 50 views
4

が発生します。psycopg2 cursor.executeは()構文エラー

psycopg2.ProgrammingError: syntax error at or near "'my_table'" 
LINE 1: SELECT * FROM 'my_table' 
:私はこのエラーを取得してい

cursor.execute('SELECT * FROM %s', ("my_table",)) 

私は間違っていますか? psycopg2がクエリに一重引用符を追加しているようで、これらの一重引用符が構文エラーの原因になっているようです。

私は、パラメータを使用しない場合は、それが正常に動作します:

cursor.execute('SELECT * FROM my_table') 

答えて

13

私はこのようなパラメータ化の文がなどはなくテーブル名(またはSQLキーワードとともに使用されることを意図していると信じています)。だからあなたは基本的にこれで不運です。

しかし、このメカニズムはSQLインジェクションを防止するためのものであり、コードライティング時にはアクセスするテーブルを知っているので、誰かが悪質なコードを挿入する可能性はほとんどありません。文字列にテーブルを書くだけです。

あなたがそのようなテーブル名のパラメトリックを保ついくつかの(おそらくあまのじゃく)の理由で、場合:

  1. テーブル名はあなたのプログラム(例えば、辞書、またはクラス属性)から来ている場合は、通常の操作を行います文字列置換。テーブル名が外部世界から来る場合
  2. (「ユーザー入力」を考える):いずれかのことをしない、または完全にユーザーを信頼し、例えば、前のアプローチ1.

を適用します。

cursor.execute(
    'SELECT * FROM %s where %s = %s' 
    % ("my_table", "colum_name", "%s"), #1 
    ("'some;perverse'string;--drop table foobar")) #2 

#1:psycopg2 #2によって後で処理を可能にするために、%sの3分の1は、この時点で別の「%s」に置き換えることがしてみましょう:これは、代わりにその第三の適切psycopg2引用して配置される文字列であります元の文字列の '%s'

+0

非常に素晴らしい詳細な答えは、私が必要なもの。ありがとう! –

関連する問題