SQLite3 查询 ORDER BY 参数与 ? 符号

bar*_*rha 3 python sqlite

我正在尝试在 python 中使用 sqlite3 进行查询,按参数列“overall_risk”或“latest_risk”(这是双数)排序

param = ('overall_risk',)
cur = db.execute("SELECT * FROM users ORDER BY ? DESC", param)
Run Code Online (Sandbox Code Playgroud)

但是,当我编写如下查询时,我不会返回按"overall_risk"(或"latest_risk")排序的数据:

"SELECT * FROM users ORDER BY " + 'overall_risk' + " DESC"
Run Code Online (Sandbox Code Playgroud)

它确实有效。

Mar*_*ers 6

SQL 参数不能用于除values之外的任何内容。使用占位符的全部意义在于正确引用值以避免将其解释为 SQL 语句的一部分或对象。

您正在尝试插入一个对象名称,而不是一个值,因此您不能使用?它。您必须使用字符串格式,并且对允许使用的名称非常小心:

cur = db.execute("SELECT * FROM users ORDER BY {} DESC".format(column_name))
Run Code Online (Sandbox Code Playgroud)

如果column_name取自用户输入,则需要根据现有列名对其进行验证。

另一种方法是使用SQLAlchemy 之类的库为您生成 SQL。请参阅SQL 表达式语言教程