我正在尝试从python脚本查询SQLite数据库。但是,无论何时使用参数化,它都只会返回第一个参数,即column2
。期望的结果是返回在column2
等于column1
的行中row1
中保留的值。
conn = sqlite3.connect('path/to/database')
c = conn.cursor()
c.execute('SELECT ? from table WHERE column1 = ? ;', ("column2","row1"))
result = c.fetchone()[0]
print(result)
打印
>>column2
每当我使用串联字符串运行它时,它都可以正常工作。
conn = sqlite3.connect('path/to/database')
c = conn.cursor()
c.execute('SELECT ' + column2 + ' from table WHERE column1 = ' + row1 + ';')
result = c.fetchone()[0]
print(result)
它打印:
>>desired data
知道为什么会这样吗?
其行为符合设计。
参数化查询提供的机制旨在将文字值传递给查询,而不是诸如列名之类的元信息。
要记住的一件事是,数据库必须能够parse参数化的查询字符串而没有手头的参数:显然,在这种假设下,不能将列名用作参数。
对于您的用例,唯一可能的解决方案是将列名称连接到查询字符串中,如第二个示例所示。如果参数来自代码外部,请确保在此之前对其进行正确验证(例如,通过对照固定的值列表进行检查)。