当model满足不了需求的时候(比如:存储过程、多表连接等),可以使用原生sql。django提供了两种方法使用原生的sql:你可以使用Manager.raw()执行原生sql,它会返回model实例,或者也可以直接执行原生sql,完全忽略model。警告:使用原生sql的时候,要尽可能的使用参数的形式以防止用户进行sql注入攻击。
Manager.raw()执行原生sql
使用raw()方法执行原生sql,返回model实例:Manager.raw(raw_query, params=None, translations=None)。
举个列子:
class Person(models.Model):
first_name = models.CharField(...)
last_name = models.CharField(...)
birth_date = models.DateField(...)执行原生sql:
>>> for p in Person.objects.raw('SELECT * FROM myapp_person'):
... print(p)
John Smith
Jane Jones具体看官方文档:https://docs.djangoproject.com/en/1.10/topics/db/sql/#executing-raw-queries
直接执行原生sql
使用django.db.connections模块进行执行原生sql,忽略model。
之前封装了该模块,地址为:http://blog.csdn.net/kelindame/article/details/52443972
使用方法:
sql = "select id,name,price from test where id > %s and id <%s "
params = [1,2]
row = fetchall(sql, params)
print(row)
#row的结果是select出来的东西,比如上面的id,name,price。
for obj in row:
print(obj["id"])
print(obj["name"])
print(obj["price"])
在Django框架下,当Model无法满足特定需求,如存储过程或多表连接时,可以采用原生SQL。Django提供两种执行原生SQL的方式:使用Manager.raw()返回Model实例,或直接执行SQL忽略Model。为防止SQL注入,建议使用参数化查询。本文将介绍如何通过Manager.raw()和django.db.connections执行原生SQL,并提供了相关示例和参考资料链接。
535

被折叠的 条评论
为什么被折叠?



