sqlite / python-引用符で囲まない名前付きパラメーター?

named-parameters prepared-statement python sqlite sqlite3
sqlite / python-引用符で囲まない名前付きパラメーター?

SQLiteで名前付きパラメーターを使用して準備済みステートメントを使用する場合(具体的にはpython sqlite3モジュールhttp://docs.python.org/library/sqlite3.htmlを使用)、とにかく引用符を付けずに文字列値を含める必要がありますか?

私はこれを持っています:

columnName = '''C1'''
cur = cur.execute('''SELECT DISTINCT(:colName) FROM T1''', {'colName': columnName})

そして、私が終わるSQLはこれだと思われます:

SELECT DISTINCT('C1') FROM T1

もちろんあまり使いませんが、私が本当に欲しいのは:

SELECT DISTINCT(C1) FROM T1 .

提供された引数を引用符で囲まないように実行メソッドにプロンプ​​トを表示する方法はありますか?

これを完全に調査するための小さなテストプログラムを書いたので、ここでの価値は次のとおりです。

import sys
import sqlite3
def getDatabaseConnection():
    DEFAULTDBPATH = ':memory:'

    conn = sqlite3.connect(DEFAULTDBPATH, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
    conn.text_factory = str

    return conn

def initializeDBTables(conn):
    conn.execute('''
    CREATE TABLE T1(
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      C1 STRING);''')
    cur = conn.cursor()
    cur.row_factory = sqlite3.Row  # fields by name

    for v in ['A','A','A','B','B','C']:
        cur.execute('''INSERT INTO T1 values (NULL, ?)''', v)

    columnName = '''C1'''
    cur = cur.execute('''SELECT DISTINCT(:colName) FROM T1''', {'colName': columnName})

    #Should end up with three output rows, in
    #fact we end up with one
    for row in cur:
        print row


def main():
    conn = getDatabaseConnection()
    initializeDBTables(conn)

if __name__ == '__main__':
    main()

とにかく、executeメソッドを操作してこれが機能するようにすることを聞いてみたいと思います。

  4  0


ベストアンサー

「SELECT DISTINCT(C1)FROM T1」では、「C1」は文字列値ではなく、SQLコードの一部です。 パラメータ(「execute」でエスケープ)は、コードの断片ではなく、値の挿入に使用されます。

3


バインディングを使用しており、バインディングは値にのみ使用でき、テーブル名または列名には使用できません。 必要な効果を得るには、文字列の補間/フォーム設定を使用する必要がありますが、列名が信頼できないソースからのものである場合、SQLインジェクション攻撃に対して無防備になります。 その場合、文字列をサニタイズ(たとえば、英数字のみを許可)し、承認インターフェイスを使用して、予期しないアクティビティが発生しないことを確認できます。

0


タイトルとURLをコピーしました