13

我有这个代码

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

我想用三个变量替换那些

var_id = bla
var_city = bla
var_state = bla
4

2 回答 2

20

使用params参数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在查询字符串中使用占位符(无论您的数据库引擎如何);它们将被参数列表中的参数替换。


来自 Django 文档的重要说明:

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

将上述查询写为:

>>> query = 'SELECT * FROM myapp_person WHERE last_name = %s' % lname
>>> Person.objects.raw(query)

不。

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

于 2012-11-02T05:12:58.887 回答
13

您还可以在查询中使用字典和变量,如下所示:

my_dict = {
   'id': 10,
   'city': 20,
   'state': 30
} 

mymodel.objects.raw('''SELECT * from users 
                       where id = %(id)s and
                       city = %(city)s and 
                       state = %(state)s ''', my_dict)

你可以在这里阅读更多内容:https ://docs.djangoproject.com/en/1.10/topics/db/sql/#passing-parameters-into-raw

于 2016-11-07T23:04:39.677 回答