我有这个代码
myquery = '''SELECT * from users
where id = 10 and
city = 20 and
state = 30'''
Run Code Online (Sandbox Code Playgroud)
现在我想用三个变量替换那些
var_id = bla
var_city = bla
var_state = bla
Run Code Online (Sandbox Code Playgroud)
K Z*_*K Z 12
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])
Run Code Online (Sandbox Code Playgroud)
params是一个参数列表.您将%s在查询字符串中使用占位符(无论您的数据库引擎如何); 它们将被params列表中的参数替换.
来自Django docs的重要说明:
警告不要在原始查询上使用字符串格式!
将上述查询编写为:
>>> query = 'SELECT * FROM myapp_person WHERE last_name = %s' % lname
>>> Person.objects.raw(query)
Run Code Online (Sandbox Code Playgroud)
别.
使用params列表可以完全保护您免受SQL注入攻击,这是攻击者将任意SQL注入数据库的常见漏洞.如果你使用字符串插值,迟早你将成为SQL注入的牺牲品.只要你记得总是使用params列表,你就会受到保护.
您还可以在查询中使用词典和变量,如下所示:
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)
Run Code Online (Sandbox Code Playgroud)
你可以在这里阅读更多内容:https://docs.djangoproject.com/en/1.10/topics/db/sql/#passing-parameters-into-raw
| 归档时间: |
|
| 查看次数: |
9773 次 |
| 最近记录: |