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

标签 python sqlite prepared-statement named-parameters

当在 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 方法以不将引号括起来的方式解释提供的参数?

我已经编写了一个小测试程序来全面探索它,所以它的值(value)在于:

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 方法使其正常工作。

最佳答案

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

关于python - sqlite/python - 不带引号的命名参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4191438/

相关文章:

C# foreach 循环迭代与查询执行时的列表

PhpStorm PDO SQL 方言

Python 多处理子类初始化

python - 如果我是 Python 新手,我应该使用哪个版本的 Python?

python - 在 Flask 应用程序中使用 sql 脚本

c# - 如何更新现有的 sqlite 数据库而不丢失 Windows Phone 8 中的数据?

php - mysql准备好的语句,这可能吗?

c# - SQLite/C# 连接池和准备语句混淆

python - 从 webdriver 中提取更多信息

Python:打印树的所有节点无意中存储数据