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



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

我不得不偏离Django ORM,因为我需要构建一个原始SQL查询,因为我必须围绕FROM <table>编写逻辑。我们选择走这条路,而不是用添加的新表每年更新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注入(:

sql = """ 
SELECT * 
FROM agg_data_%s 
WHERE dataview = '%s' 
ORDER BY sortorder """ % (tbl, data_view)
cursor.execute(sql)

用这些柠檬做柠檬水怎么样?

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

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

这里CCD_ 9将";折叠";到CCD_ 10,因此在第一个字符串插值之后产生CCD_。

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

最新更新