2016-03-21 2 views
0

フィールドナンバーが変更されたフィールド名を動的に呼び出そうとしています。例Hard4、Hard6、Hard8、Hard10をフィールドとして持ち、それらをロールに基づいて呼び出したいとします。私は現在、構文エラーを取得し、私は:(stackoverflowのを検索してで修正するために、とにかく見つけることができませんsqlite動的にフィールド名を呼び出す

すべてのヘルプは感謝される CODE:。!

conn = sqlite3.connect('C:\sqlite\crapsdatabase.db') 
c = conn.cursor() 

die1 = 3 
die2 = 3 

theroll = die1+die2 
if die1 == die2: 
    c.execute("SELECT playerName FROM player WHERE Hard? > 1", (theroll,)) 
    for row in c: 
     for field in row: 
      print(field) 

エラー:

c.execute("SELECT playerName FROM player WHERE Hard? > 1", (theroll,)) 
sqlite3.OperationalError: near "?": syntax error 

これは大きな違いがある場合はpython 3を使用しています。また、?を一重引用符で囲んでみました...

もう一度見ていただきありがとうございます

答えて

1

この場合、%種類または.format()種類の文字列書式を使用するのが適切です。

c.execute("SELECT playerName FROM player WHERE Hard%d > 1" % theroll) 

ユーザー入力からSQL文を作成する際には、文字列フォーマットを使用しないでください。ユーザー入力を処理する場合は、常に? -styleパラメーター置換を使用してください。

+0

ので、この1つはそれをやりました。他のコードは、Hard6フィールドの値に関係なく、すべてのプレーヤーを返しました。ユーザーはダイス番号を入力する必要はありませんが、乱数発生器は....ありがとうございます! – HELPMEPLEASE

0

?演算子は、SQLコードにテキストを単純に入力することはありません。内部的には、Sqliteはいくつかの処理を追加します。完全な平文のSQLクエリーを使用する場合は、テキスト、エスケープ文字の前後に疑問符を付けます。?演算子を使用する場合、sqliteもこれを処理します。

あなたはだけでなく、フォーマット文字列を使用することができます。

c.execute("SELECT playerName FROM player WHERE %s > 1" % ("Hard%s" % the roll,)) 
+0

ドロンありがとう!何らかの理由であなたのコードがベットが0だったとしてもすべてのプレーヤーを返しました...理由はわかりません!ありがとうございました! – HELPMEPLEASE

+0

これを混ぜて今すぐ修正しました。 – dron22

関連する問題