如何在django python中的原始sql中插入参数

时间:2012-11-02 05:01:50

标签: python django

我有这段代码

myquery =   '''SELECT * from users 
               where id = 10 and
               city = 20 and 
               state = 30'''

现在我想替换那些有三个变量的那些,比如

var_id = bla
var_city = bla
var_state = bla

2 个答案:

答案 0 :(得分:12)

使用params argument to raw()

var_id = 10
var_city = 20
var_state = 30

mymodel.objects.raw('''SELECT * from users 
                       where id = %s and
                       city = %s and 
                       state = %s ''', [var_id, var_city, var_state])

params是一个参数列表。您将在查询字符串中使用%s占位符(无论您的数据库引擎如何);它们将被params列表中的参数替换。


Django docs的重要说明:

  

警告   不要在原始查询上使用字符串格式化!

     

将上述查询编写为:

很有诱惑力
>>> query = 'SELECT * FROM myapp_person WHERE last_name = %s' % lname
>>> Person.objects.raw(query)
  

别。

     

使用params列表可以完全保护您免受SQL注入攻击,这是攻击者将任意SQL注入数据库的常见漏洞。如果你使用字符串插值,迟早你将成为SQL注入的牺牲品。只要你记得总是使用params列表,你就会受到保护。

答案 1 :(得分:5)

您还可以在查询中使用词典和变量:

next

您可以在此处详细了解:https://docs.djangoproject.com/en/1.10/topics/db/sql/#passing-parameters-into-raw