2016-04-05 19 views
1

コードは、Python環境(SQLクエリ内ではない)のユーザからの入力に対してクエリベースを実行することになっています。たとえば、変数はPython環境で定義されており、生の入力ではtable name = customersの場合、テーブルcustomerの列名を出力することができます。どのようにsqlite3クエリにpython変数を渡すのですか?

ただし、次のコードは構文エラーを報告します。バックスラッシュと内部引用符を削除すると、no such column: table_nameと表示されます。値customersがクエリにパススルーされておらず、クエリがtable_nameを文字列として読み取っているようです。

助けてください。おかげ

import sqlite3 

    def ask_column(db_name, table_name): 
     conn = sqlite3.connect(db_name) 
     c = conn.cursor() 
     c.execute('SELECT sql FROM sqlite_master WHERE type = \'table\' And name = \'table_name\'') 
     print c.fetchall() 
     conn.close() 

db_name = raw_input("Please type the database name : ") 
table_name = raw_input("Please type the table name: ") 
ask_column(db_name, table_name) 

答えて

3

あなたはこの使用パラメータ置換を行うことができます。 Python's sqlite3 moduleを使用する場合は、パラメータ値を疑問符(?)で置き換え、タプルの値を指定してください。 Pythonは置換を自動的に処理し、値をエスケープしてSQLインジェクションのリスクを制限します。ここで

は例です:最初に、テーブルを作成します。

>>> import sqlite3 
>>> c = conn.cursor() 
>>> c.execute("""CREATE TABLE test (fruit, colour)""") 
<sqlite3.Cursor object at 0x7f41e929f650> 

今いくつかの値を挿入します。?文字が値のプレースホルダとして使用されているか注意してください。

>>> c.executemany("""INSERT INTO test VALUES (?, ?)""", [('apple', 'green'), ('banana', 'yellow'), ('cherry', 'red')]) 
<sqlite3.Cursor object at 0x7f41e929f650> 

そして、ここです(値が1つのみであっても、タプルとして値を渡し続けます)。

>>> c.execute("""SELECT fruit, colour FROM test WHERE fruit = ?;""", ('apple',)) 
<sqlite3.Cursor object at 0x7f41e929f650> 
>>> print(c.fetchall()) 
[('apple', 'green')] 
関連する問題