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