2012-12-14 4 views
10

私はこのsqlite3クエリをPythonで実行しようとしています。私はコードを最小限に抑え、sqlite.connectなどの作業をしました。実行中のPython sqlite3文字列

column = 'Pron_1_Pers_Sg' 
goal = 'gender' 
constrain = 'Mann' 


with con: 
    cur = con.cursor() 

    cur.execute("SELECT ? FROM Data where ?=?", (column, goal, constrain)) 
    con.commit() 

    rows = cur.fetchall() 

    for element in rows: 
     values.append(element) 

これは空のリストを返します。 文字列をハードコードすると動作し、値を返します。

答えて

25

パラメータマーカーは、式、つまり値に対してのみ使用できます。 テーブル名や列名などの識別子には使用できません。

使用この:

cur.execute("SELECT "+column+" FROM Data where "+goal+"=?", (constrain,)) 

またはこの:

cur.execute("SELECT %s FROM Data where %s=?" % (column, goal), (constrain,)) 

+0

私はこのことを書いてみる前に、私は誓うことができました!とにかく、今は動作します。ありがとう! – Steffen

+1

これはSQLインジェクションに対して脆弱ですか? –

+1

@DrewV「列」または「ゴール」が攻撃者によって制御されることを許可している場合はYesです。 –

-1

今日私はかなり似たような問題を抱えていました。私は、これはあなたの問題を解決する可能性がある場合、わからない:

cur.execute("SELECT ? FROM Data where ?=?", (column, goal, constrain,)) 

重要なのは、最後のあり、

が、これは私のコードの問題だった、それを試してみる - ので、多分それはあまりにもあなたを助けます。申し訳ありませんが、本当に理由を説明することができないため、私は自分自身を学び、Python/sqliteを数週間使っています。

+2

最後の '、'は、要素が1つのタプルに対してのみ、単純な式と区別するために必要です。 –

+1

ありがとうございますが、それは役に立ちません。しかし、私は何かを説明することができます:つまり、与えられた値がタプルでなければならないからです。 – Steffen

+0

ありがとうございます。これは本当に私が頭を一日中包み込もうとしたことを理解するのを助けました。 – sdoering

0

この試してみてください(そして、あなたが実際にデータにアクセスして完了する前にコミットしません。):c.execute("SELECT {idf} FROM Data WHERE {goal}".\ format(idf=column, goal=constrain))

関連する問題