SQL参数仅用于值。其他任何事情都可能改变查询的含义。(例如,
ORDER BY password可能会留下提示
ORDER BY (SELECt ...FROM OtherTable ...)。)
为了确保来自客户端的列名有效,您可以使用白名单:
if order_by not in ['name', 'age']: raise ...execute('... ORDER BY {}'.format(order_by))但是将字符串集成到查询中仍然是一个坏主意,因为验证和实际表可能不同步,或者您可能忘记了检查。最好从客户端返回一个列索引,以便您使用的实际字符串始终是您自己的,并且在正常测试期间可以轻松发现任何错误:
order_by = ['name', 'age'][order_index]execute('... ORDER BY {}'.format(order_by))


