首页 > 解决方案 > 使用准备好的选择语句错误地格式化查询

问题描述

(Windows 7 上的 Python 3.7.2)

当我在 Python 中查询 sqlite3 数据库时,它可以正常工作:

cursor.execute('SELECT name FROM names')
#returns [('Bob',), ('Alice',), ('Jim',), ('Sally',)]

但是,当我尝试执行准备好的语句时,会发生这种情况:

c.execute('SELECT ? FROM names', ('name',))
#returns [('name',), ('name',), ('name',), ('name',)]

我最好的猜测是发生了一些奇怪的事情,导致实际执行语句看起来像“SELECT 'name' FROM names”,而不是“SELECT name FROM names”。下面是一些更详细的代码来阐述这个问题。

import sqlite3

conn = sqlite3.connect('db.db')
# This is a database with a single table:

# CREATE TABLE 'names' (
#   'name'  TEXT,
#   PRIMARY KEY('name')
# );

# 'names' has four entries:
# "Bob"
# "Alice"
# "Jim"
# "Sally"

c = conn.cursor()

c.execute('SELECT name FROM names')
print(c.fetchall())
# prints: [('Bob',), ('Alice',), ('Jim',), ('Sally',)]
c.execute('SELECT ? FROM names', ('name',))
print(c.fetchall())
# prints: [('name',), ('name',), ('name',), ('name',)]
c.execute('SELECT ? FROM names', ('chicken nuggets',))
print(c.fetchall())
# prints: [('chicken nuggets',), ('chicken nuggets',), ('chicken nuggets',), ('chicken nuggets',)]
c.execute('SELECT "name" FROM names')
print(c.fetchall())
# prints: [('Bob',), ('Alice',), ('Jim',), ('Sally',)]
c.execute("SELECT 'name' FROM names")
print(c.fetchall())
# prints: [('name',), ('name',), ('name',), ('name',)]
c.execute("SELECT ? FROM names", ("name",))
print(c.fetchall())
# prints: [('name',), ('name',), ('name',), ('name',)]

conn.close()

我应该如何解决这个问题?

标签: pythonsqlite

解决方案


推荐阅读