以下是我的问题的概括
Col_Index = 'Foo'
data = SQLfunctions.fetchSQL("SELECT Col_" + Col_Index + "FROM MyTable)
其中fetchSQL
是一个返回SQL语句值的函数。我试图重写这个,以便使用Col_Index
传递?
并连接字符串,即。
data = SQLfunctions.fetchSQL("SELECT Col_ || ? FROM MyTable", [Col_Index])
但这不起作用,因为它似乎没有使用||
执行?
(类似column Col_ does not exist
的错误)。
如何更改此功能以使其正常工作?
答案 0 :(得分:4)
您不能将SQL参数用于除值之外的任何内容。
您不能将它们用于表名或列或SQL函数或SQL语法的任何其他部分,正是,因为它们旨在防止此类使用。
换句话说,如果SQL参数可以用于生成SQL代码(包括对象名称),那么它们对于它们的主要用途之一将是无用的:防止SQL注入攻击。
我很害怕你生成查询的那部分。
非常非常小心使用用户提供的数据,不要在不清理和/或严格限制其可容纳的值范围的情况下从外部源获取Col_Index
。
您可以查看SQLAlchemy为您生成SQL,因为它可以确保任何对象名称也被正确转义:
from sqlalchemy.sql import table, literal_column, select
tbl = table('MyTable')
column = literal_column('Col_' + Col_Index)
session.execute(select([column], '', [tbl]))