ORM执行原生sql语句

在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询。

Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的SQL语句。

执行原生查询

raw()管理器方法用于原始的SQL查询,并返回模型的实例:

注意:raw()语法查询必须包含主键。

这个方法执行原始的SQL查询,并返回一个django.db.models.query.RawQuerySet 实例。 这个RawQuerySet 实例可以像一般的QuerySet那样,通过迭代来提供对象实例。

举个例子:

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)

raw()查询可以查询其他表的数据。

举个例子:

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)

###直接执行自定义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)

如果你想通过自己创建的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)

最新文章

  1. 不知道张(zhāng)雱(pāng)是谁?你out了!
  2. String.prototype运用
  3. [原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别
  4. 【mongoDB中级篇②】索引与expain
  5. jquery图片放大器插件
  6. thinking in java Generics Latent typing
  7. 项目管理系统 SQL2005数据库查询CPU100%问题研究
  8. [Angular 2] Refactoring mutations to enforce immutable data in Angular 2
  9. 【转】Ubuntu 上编译Android出现cannot find -lstdc++解决办法
  10. AOP---jdk动态代理的思考
  11. Linux上 ps 命令的用法
  12. Linux使用踩坑记
  13. SOFA 源码分析 —— 服务发布过程
  14. js 原型原型链
  15. asp.net core cors中间件
  16. CentOS 6.x 如何升级 glibc 2.17
  17. spring中classpath
  18. C++类中一个构造函数调用另一个构造函数
  19. ES6 声明变量的6种方法
  20. 可选的binlog解析组件

热门文章

  1. php加速缓存器opcache,apc,xcache,eAccelerator
  2. nginx中图片无法显示
  3. dede 复制文章,远程图片无法本地化
  4. 清除所有Cookie
  5. .NET中的Request
  6. PAT 1078 字符串压缩与解压(20)(代码+思路)
  7. Codeforces 691C. Exponential notation 模拟题
  8. forbidden
  9. 构造函数constructor 与析构函数destructor(五)
  10. 二进制搭建kubernetes多master集群【三、配置k8s master及高可用】