2017-03-07 3 views
0

Stack OverflowやSQLiteクエリに変数を挿入するための正しい構文を探している他のオンラインリサーチを検索しています。しかし、サポートされている3つの構文のどれも、私の質問には役に立たなかった。SQLite DB-API構文のPython 3.5の問題

私はSQLiteのDB-APIのための3つのサポート構文があることがわかった。

:私は次のことを実行したときしかし、私はこれらのエラーを受け取るに

http://www.philvarner.com/test/ng-python3-db-api/

から取ら

qmark: 
curs.execute("SELECT * FROM actors where actor.first_name = ?",("D'Angelo",)) 

numeric: 
curs.execute("SELECT * FROM actors where actor.first_name = :1", ("D'Angelo",)) 

named: 
curs.execute("SELECT * FROM actors where actor.first_name = :first_name",{'first_name': "D'Angelo"}) 

named: tableListQuery = "SELECT name FROM :dbFile WHERE type='table' ORDER BY Name", {'dbFile': dbFile} userCursor.execute(tableListQuery) Pycharm error: Expected type 'str', got 'Tuple[str, Dict[str, Any]]' Terminal error: File "./dedupeDatabase.py", line 15, in Describe userCursor.execute(tableListQuery) ValueError: operation parameter must be str ------------------------------------------------- qmark: tableListQuery = "SELECT name FROM ? WHERE type='table' ORDER BY Name", (dbFile,) userCursor.execute(tableListQuery) Pycharm error: Expected type 'str', got 'Tuple[str, Tuple[Any]]' instead Terminal error: File "./dedupeDatabase.py", line 15, in Describe userCursor.execute(tableListQuery) ValueError: operation parameter must be str ------------------------------------------------- numeric: tableListQuery = "SELECT name FROM :1 WHERE type='table' ORDER BY Name", (dbFile,) userCursor.execute(tableListQuery) Pycharm error: Expected type 'str', got 'Tuple[str, Tuple[Any]]' Terminal error: File "./dedupeDatabase.py", line 15, in Describe userCursor.execute(tableListQuery) ValueError: operation parameter must be str 

この問題に関するご意見をお聞かせください。

+3

クエリのテーブル名をパラメータ化することはできません。 [ここ](http://stackoverflow.com/questions/1274432/sqlite-parameters-not-allowing-tablename-as-parameter)を参照してください。この値を自分自身で(外部ソースから来たものであれば)サニタイズしてから、 '.format()'を使ってクエリ文字列に入れてください。 – roganjosh

+0

これは本当ですが、OPの問題の原因ではありません遭遇する;これは単純にPythonの構文上の問題です。ここでは、タプルを定義し、クエリ文字列とパラメータを別々に渡すのではなく、 'execute'メソッドに渡します。 –

+0

Pythonでこれらの値を「サニチズ」する方法のサンプルコードを提供してください。私はあなたが何を意味するかを100%確信していません –

答えて

2

基本的な問題は、単に構文の1つです。 tableListQuery"my query string", paramsと定義すると、タプルが定義されます。あなたはそのタプルを直接executeに渡すことはできません、そして、ドキュメンテーションはできるとは言いません。[1]

あなたが引用され、元のスニペットに示すように実行する必要があります。コメントで指摘したように、あなたはフィールドのようなもののためにSQLパラメータを使用することができないということです、今

tableListQuery = "SELECT name FROM table WHERE type=:dbFile ORDER BY Name" 
params = {'dbFile': dbFile} 
userCursor.execute(tableListQuery, params) 

第二の問題をかテーブル名。 WHERE値のみに適用されます。そのためには、通常のPython文字列の書式設定を使用する必要があります。

[1] *演算子で実行できますが、これはおそらくこの時点で混乱している可能性があります。