在原始Django SQL查询中正确转义字符串

在原始Django SQL查询中正确转义字符串,sql,django,orm,Sql,Django,Orm,实际上,问题的根源是糟糕的数据库设计,这要追溯到我开始这里之前很久,但这个问题不会在一天结束前甚至一周结束前得到解决。因此,我需要找到一种更好的方法来处理以下问题,以便添加一个特性 我不得不偏离Django ORM,因为我需要构建一个原始SQL查询,因为我必须围绕中的编写逻辑。我们选择走这条路,而不是用添加的新表每年更新几次models.py Django文档中有许多地方开始说“不要在原始查询中使用字符串格式,也不要在SQL字符串中使用引号占位符!” 如果我这样写查询: cursor.execu

实际上,问题的根源是糟糕的数据库设计,这要追溯到我开始这里之前很久,但这个问题不会在一天结束前甚至一周结束前得到解决。因此,我需要找到一种更好的方法来处理以下问题,以便添加一个特性

我不得不偏离Django ORM,因为我需要构建一个原始SQL查询,因为我必须围绕中的
编写逻辑。我们选择走这条路,而不是用添加的新表每年更新几次
models.py

Django文档中有许多地方开始说“不要在原始查询中使用字符串格式,也不要在SQL字符串中使用引号占位符!”

如果我这样写查询:

cursor.execute("""
    SELECT * \
    FROM agg_data_%s \
    WHERE dataview = %s \
    ORDER BY sortorder """, [tbl, data_view])
它在
tbl
周围添加了单引号,这显然会引起问题,但会正确地构造单引号中包含的
WHERE
子句

这样做不会在
tbl
周围加单引号,但会迫使您在
WHERE
周围加单引号,至少可以说这是不好的(打开它进行SQL注入):


用这些柠檬做柠檬水?

参数
%s
只能用于数值。不适用于标识符的(部分),如表/列名。如果您确信
tbl
是安全的,那么您可以使用以下工具逃跑:

sql = """
    SELECT * \
    FROM agg_data_%s \
    WHERE dataview = %%s \
    ORDER BY sortorder """ % tbl, [data_view])
在这里,
%%
将“折叠”为
%%
,因此在第一次字符串插值后,您将生成
%s

但最好不要为此使用不同的表,并因此过滤表,例如通过外键

sql = """
    SELECT * \
    FROM agg_data_%s \
    WHERE dataview = %%s \
    ORDER BY sortorder """ % tbl, [data_view])