sqlite / python - именованные параметры без кавычек? - PullRequest
4 голосов
/ 16 ноября 2010

При использовании подготовленных операторов с именованными параметрами в 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 .

Есть ли способ побудить метод execute интерпретировать предоставленные аргументы таким образом, чтобы он не заключал в них кавычки?

Я написал небольшую тестовую программу, чтобы в полной мере изучить ее, поэтому она стоит:

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, чтобы это сработало.

Ответы [ 2 ]

3 голосов
/ 16 ноября 2010

В SELECT DISTINCT(C1) FROM T1 C1 не является строковым значением, это фрагмент кода SQL. Параметры (экранированные в execute) используются для вставки значений, а не фрагментов кода.

0 голосов
/ 20 ноября 2010

Вы используете привязки, и привязки могут использоваться только для значений, но не для имен таблиц или столбцов.Вам нужно будет использовать интерполяцию строк / formstting, чтобы получить желаемый эффект, но он останется открытым для атак внедрения SQL, если имя столбца получено из ненадежного источника.В этом случае вы можете очистить строку (например, разрешить только буквенно-цифровые символы) и использовать интерфейс авторизатора, чтобы убедиться, что никаких неожиданных действий не произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...