sqlite/python-命名参数不带引号?

sqlite/python-命名参数不带引号?,python,sqlite,prepared-statement,named-parameters,Python,Sqlite,Prepared Statement,Named Parameters,在SQLite(特别是python sqlite3模块)中使用带命名参数的准备语句时,是否仍然可以包含字符串值而不在其周围加引号 我有这个: columnName = '''C1''' cur = cur.execute('''SELECT DISTINCT(:colName) FROM T1''', {'colName': columnName}) 看来我最终得到的SQL是: SELECT DISTINCT('C1') FROM T1 这没有多大用处当然,我真正想要的是: SELECT D

在SQLite(特别是python sqlite3模块)中使用带命名参数的准备语句时,是否仍然可以包含字符串值而不在其周围加引号

我有这个:

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方法来实现这一点。

中选择DISTINCT(C1)FROM T1
C1
不是字符串值,而是一段SQL代码。参数(在
execute
中转义)用于插入值,而不是代码片段。

您使用的是绑定,绑定只能用于值,不能用于表或列名。您必须使用字符串插值/formsting来获得所需的效果,但如果列名来自不受信任的源,则会使您受到SQL注入攻击。在这种情况下,您可以清理字符串(例如仅允许字母数字),并使用authorizer接口检查不会发生意外活动