2017-10-13 9 views
-1

必要なテーブルを作成する設定ファイルを取得しようとしています。私はこれで始めました。パラメータを使用しているときのpython3とsqlite3の構文エラー

cursor.execute("CREATE TABLE IF NOT EXISTS measurement (time DATETIME)") 

これは機能します。パラメータを使用して移動するこれには多くの異なるバリエーションを試しましたが、おおよそ同じエラーが発生します。

table_name = scrub_table_name('measurement') 
field_name = some_function1('time') 
field_type = some_function2('DATETIME') 
cursor.execute("CREATE TABLE IF NOT EXISTS {} (? ?)".format(table_name), (field_name, field_type)) 

エラーはこれです。

sqlite3.OperationalError:近くに「?」:構文エラー

私はバインドされたバージョンを使用する場合、私は同じことを取得します。

cursor.execute("CREATE TABLE IF NOT EXISTS {} (:fn :ft)".format(table_name), {"fn" : field_name, "ft" : field_type}) 

このエラーが発生します。

sqlite3.OperationalError:近い ":FFN":構文エラーが

はちょうどので、私の質問に対する混乱はありません。 明らかに、テーブル名を自分自身でスクラブして文字列に挿入する必要がありましたが、sqlite executeはこの部分のパラメータを受け付けません。したがって、ob.format()。私はこれに間違っていることに興味がありますが、私は主にその作り方に興味がありますか? of:fnパラメータが機能します。 私はDebianシステムで同じエラーでテストしたので、私はそれを変更することを期待していない、自家製のMac 10.12.6でsqlite3.16.0でPython 3.6.2を使用しています。

答えて

1

パラメータ化されたSQL式は、テーブル/カラム名やデータ型ではなく、リテラル値のパラメータ化にのみ使用されます。リテラル値を使用して、これらの? Sを交換し、常に構文的に無効なコマンドが生成されますので、

INSERT INTO table_name VALUES (?, ?); 
SELECT * FROM table_name WHERE column_name = ?; 
UPDATE table_name SET col1 = ? WHERE col2 = ?; 

しかしCREATE TABLE IF NOT EXISTS table_name (? ?)は、ありません:たとえば、次のようcursor.execute()に渡す有効なコマンドです。

+0

2番目の例でテーブル名を使用できますが、私のバージョンでは使用できない理由を説明できますか?また、これについてのドキュメントは、使用していたドキュメントとリンクしてください。 [Here](https://docs.python.org/2/library/sqlite3.html)を参照してください。 "代わりに、DB-APIのパラメータ置換を使用します。値を使用する場所にプレースホルダとして?を入れ、カーソルのexecute()メソッドの2番目の引数として値の組を指定します。 – Rhett

+0

"2番目の例でテーブル名で使用できる理由は説明できますが、私のバージョンでは使用できないのですか? - あなたは 'SELECT * FROM table_name ...'の例を参照していますか? 'table_name'は変数がありません。私はそれがテーブルであることが明確になるように、私がサンプルテーブルに名前を付けたものです。ドキュメントの内容に関しては、オブジェクト名や型名ではなく、SQL *値*のプレースホルダのみを使用できることが確認されています。 – jwodder

+0

私は列名について質問するつもりだったのは申し訳ありませんが、どちらもパラメータとしてテーブル名を渡していませんが、私の列名にエラーがあり、そうではありません。私はあなたが選択声明であることを除いて、私たちの2つの用途の違いが何であるかを理解していませんでした。 – Rhett

関連する問題