1

私はこのコードを持っています:

conn = sqlite3.connect("testDB")
curs = conn.cursor()

curs.execute("CREATE TABLE IF NOT EXISTS testTable( col1 VARCHAR, col2 VARCHAR)")
c1 = "value1"
c2 = "value2"
curs.execute("INSERT INTO testTable VALUES (?,?)", (c1, c2))#this works fine
conn.commit()

def inDB(curs, table, col, value):
    curs.execute("SELECT * FROM ? WHERE ?=?",(table, col, value)) #problemis here
    return bool(curs.fetchone())

print inDB(curs, "testTable", "col1", c1)

それは私にこのエラーを与えます:

Traceback (most recent call last):
  File "test.py", line 16, in <module>
    print inDB(curs, "testTable", "col1", c1)
  File "test.py", line 13, in inDB
    curs.execute("SELECT * FROM ? WHERE ?=?",(table, col, value))
sqlite3.OperationalError: near "?": syntax error

これが機能しない理由と、これを修正するにはどうすればよいですか?

4

2 に答える 2

2

よくわかりませんが、テーブルまたは列の名前にバインド変数を使用できるとは思いません...

試す

curs.execute("INSERT INTO ? VALUES (?,?)", (testTable, c1, c2))

うまくいかないに違いない。この場合、?テーブル名または列名での使用を避ける必要があります。Javaのように「+」のように、連結演算子を使用して文字列を結合したいと思います。例 (Java スタイル):

("INSERT INTO " + testTable + " VALUES (?,?)");
于 2012-07-12T21:25:38.980 に答える
0

これは、ドキュメントから抽出できるすべてです。

http://www.sqlite.org/cintro.html

3.0 パラメータのバインドとプリペアド ステートメントの再利用

SQLite では、文字列リテラルを含めることが有効な場合はいつでも、次のいずれかの形式でパラメーターを使用できます。

http://www.sqlite.org/c3ref/bind_blob.html

sqlite3_prepare_v2() およびそのバリアントへの SQL ステートメント テキスト入力では、リテラルは、次のテンプレートのいずれかに一致するパラメーターに置き換えることができます。

http://www.sqlite.org/lang_insert.html

SQLite INSERT

は通常のリテラル値ではないため、パラメーター化されたテーブル名はおそらく使用できません[database-name.]table-name(そのため、 のようなステートメントを記述できませんINSERT INTO 'foo'||'bar'||12 VALUES ...)。

あるいは、まったく別のものかもしれません。:)

于 2012-07-12T21:59:48.070 に答える