在模型查询API不够用的状况下,咱们还可使用原始的SQL语句进行查询。python
Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回模型实例;另外一种是彻底避开模型层,直接执行自定义的SQL语句。 <br/>mysql
raw()管理器方法用于原始的SQL查询,并返回模型的实例:sql
注意:raw()语法查询必须包含主键。数据库
这个方法执行原始的SQL查询,并返回一个django.db.models.query.RawQuerySet 实例。 这个RawQuerySet 实例能够像通常的QuerySet那样,经过迭代来提供对象实例。django
举个例子:app
class Person(models.Model): first_name = models.CharField(...) last_name = models.CharField(...) birth_date = models.DateField(...)
能够像下面这样执行原生SQL语句fetch
>>> for p in Person.objects.raw('SELECT * FROM myapp_person'): ... print(p)
raw()查询能够查询其余表的数据。spa
举个例子:code
ret = models.Student.objects.raw('select id, tname as hehe from app02_teacher') for i in ret: print(i.id, i.hehe)
raw()方法自动将查询字段映射到模型字段。还能够经过translations参数指定一个把查询的字段名和ORM对象实例的字段名互相对应的字典对象
d = {'tname': 'haha'} ret = models.Student.objects.raw('select * from app02_teacher', translations=d) for i in ret: print(i.id, i.sname, i.haha)
原生SQL还可使用参数,注意不要本身使用字符串格式化拼接SQL语句,防止SQL注入!
d = {'tname': 'haha'} ret = models.Student.objects.raw('select * from app02_teacher where id > %s', translations=d, params=[1,]) for i in ret: print(i.id, i.sname, i.haha)
<br/> ###直接执行自定义SQL
有时候raw()方法并不十分好用,不少状况下咱们不须要将查询结果映射成模型,或者咱们须要执行DELETE、 INSERT以及UPDATE操做。在这些状况下,咱们能够直接访问数据库,彻底避开模型层。
咱们能够直接从django提供的接口中获取数据库链接,而后像使用pymysql模块同样操做数据库。
from django.db import connection, connections cursor = connection.cursor() # cursor = connections['default'].cursor() cursor.execute("""SELECT * from auth_user where id = %s""", [1]) ret = cursor.fetchone()
若是你想经过本身建立的python文件在django项目中使用django的models,那么就须要调用django的环境:
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings") import django django.setup() from app01 import models #引入也要写在上面三句以后 books = models.Book.objects.all() print(books)