ORM执行原生sql语句

  • 在模型查询api不够用的情况下,我们还可以使用原始的sql语句进行查询
  • 方式1 raw()
      raw()方法,返回模型的实例django.db.models.query.RawQuerySet 实例
这个RawQuerySet实例可以像一般的QuerySet那也,通过迭代来提供对象实例
#注意:raw()语句查询必须包含主键
ret = models.Book.objects.raw('select * from app01_book;')
#raw只能操作前面表的数据,比如Book
print(ret)
for i in ret:
print(i,type(i)) #Book Object raw()方法自动将查询字段映射到模型字段,还可以通过translations参数指定一个把查询的字段名和ORM对象实例的字段名互相对应的字典
d = {'title':'xx'} #title是数据库中字段名,把title映射为xx
ret = models.Book.objects.raw('select * from app01_book;',translations=d)
for i in ret:
print(i.price,i.xx)#调用i.xx得到的值相当于i.title得到的值 原生sql还可以使用参数,注意不要自己使用字符串格式化拼接sql,防止sql注入
d = {'title':'xx'}
ret = models.Book.objects.raw('select * from app01_book where id>%s',translations=d,params=[1,])
for i in ret:
print(i.id,i.xx) #打印结果为id>1的所有数据
  • 方式2 直接从django提供的接口中获取数据库连接,然后使用pymysql一样操作数据库
      from django.db import connection
cursor = connection.cursor()
cursor.execute('select * from app01_book where id>%s',[1])
#ret = cursor.fetchone() 查一条
ret = cursor.fetchall() 查所有

python脚本中调用django环境

      xx.py文件,随便建一个文件,单独运行这个文件时,想获取到django的内容环境,需要下面的写法,下面这段代码就是manage.py文件中的开头那一段代码
import os
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE','django_orm2.settings')
import django
django.setup()
#然后就可以操作了,如下面操作模型类
from app01 import models #引入也要写在上面三句话之后
print(models.Book.objects.all())

补充多个app配置models

  • app01的models文件内容
      from django.db import models
class UserInfo(models.Model):
name = model.CharField(max_length=12)
  • app02的models文件内容
      from django.db import models
class Class(models.Model):
user = models.ForeignKey('app01.UserInfo')#如果需要两个app之间的models进行关联,直接这样写就可以,或者直接将那个被关联的表,通过import的方法引入进行关联。

ORM锁和事务

加锁写法必须用在事务里面

      作用:可以通过锁防止数据被其它事务修改
model.Book.objects.select_for_update().all()
原生sql写法
select * from app01_book for update;

事务写法

  • 方式1
      DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mxshop',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'root',
'PASSWORD': '123', "ATOMIC_REQUESTS": True, #全局开启事务,绑定的是http请求响应整个过程
},
}
工作原理:当有请求过来时,django会在调用视图方法前开启一个事务,如果请求正确处理并正确返回了结果,django就会提交该事务,否则,django会回滚该事务
  • 方式2 给视图函数直接加装饰器,表示整个视图逻辑中的sql都捆绑为一个事务操作
      from django.db import transaction
#sql一旦出错,会自动回滚
@transaction.atomic
def viewfunc(request):
sid = transaction.savepoint() #创建保存点
#This code executes inside a transaction
do_stuff() #事务和变量等处理逻辑是没关系的 do_other_stuff()
transaction.savepoint_rollback(sid) #回滚保存点
transaction.savepoint_commit(sid)#提交保存点
  • 方式3 给逻辑加视图
      from django.db import transaction
def viewfunc(request):
#This code executes in autocommit mode(Django's default)
do_stuff() with transaction.atomic(): #加事务
#This code executes inside a transaction
do_more_stuff()
#model.Book.objects.select_for_update().all()
do_other_stuff()

django学习第九天---raw查询原生sql和python脚本中调用django环境和ORM锁和事务的更多相关文章

  1. django系列5.4--ORM中执行原生SQL语句, Python脚本中调用django环境

    ORM执行原生sql语句 在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询. Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回 ...

  2. Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境

    目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...

  3. $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

    在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...

  4. Python--day69--pythonDjango终端打印SQL语句、在Python脚本中调用Django环境

    Django终端打印SQL语句 在Django项目的settings.py文件中,在最后复制粘贴如下代码: LOGGING = { 'version': 1, 'disable_existing_lo ...

  5. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  6. 在Python脚本中调用Django环境

    import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", " ...

  7. Django框架----在Python脚本中调用Django环境

    在项目根目录下新建脚本文件script.py import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTI ...

  8. 在Python脚本中调用Django环境(方便、右键运行,可用于ORM测试)

    随便创建一个py文件即可: import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODUL ...

  9. django系列5.5--分组查询,聚合查询,F查询,Q查询,脚本中调用django环境

    一.聚合查询 aggregate(*args, **args) 先引入需要的包,再使用聚合查询 #计算所有图书的平均价格 from django.db.models import Avg Book.o ...

  10. ORM基础3 在python脚本里调用Django环境

    1.查询 1.# all获取所有的object,结果QuerySet,列表 print('all'.center(80, '=')) ret = models.Person.objects.all() ...

随机推荐

  1. 【转帖】JVM 元数据区的内存泄漏之谜

    https://www.infoq.cn/article/Z111FLot92PD1ZP3sbrS 一.问题描述 某天,SRE 部门观察到一个非常重要的应用里面有一台服务器的业务处理时间(Transa ...

  2. [转帖]Linux文本处理三剑客sed详解(正则匹配、命令示例)

    https://developer.aliyun.com/article/885609?spm=a2c6h.24874632.expert-profile.312.7c46cfe9h5DxWK 简介: ...

  3. [转帖]sudo 命令_su、sudo、sudo su、sudo -i的用法和区别

    sudo 命令 1.sudo 简介 sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用户 ...

  4. MYsql备份恢复简单过程

    1. 备份数据库 建完数据库更新完补丁之后进行数据库的备份操作. mysqldump -uroot --databases yourdatabase -p > /home/yourdatabas ...

  5. 如何抓取http请求/拦截器用法

    我们都知道postman是模拟接口向服务端发送请求的,在编写请求数据的时候非常 麻烦,那么如果我们可以先抓取该接口后直接使用,就方便的很多 抓取http请求 1.我们打开postman时就会看见右上角 ...

  6. vulnhub靶场渗透学习

    攻击机:192.168.100.251 目标机:192.168.100.17 netdiscover netdiscover -r 192.168.100.1/24 Currently scannin ...

  7. 深度学习应用篇-计算机视觉-语义分割综述[6]:DeepLab系列简介、DeepLabV3深入解读创新点、训练策略、主要贡献

    深度学习应用篇-计算机视觉-语义分割综述[6]:DeepLab系列简介.DeepLabV3深入解读创新点.训练策略.主要贡献 0.DeepLabV3深入解读 1.DeepLab系列简介 1.1.Dee ...

  8. 【4】jupyter notebook快速入门、以及常用快捷键使用

    相关文章: [1]Anaconda安装超简洁教程,瞬间学会! [2]Anaconda下:ipython文件的打开方式,Jupyter Notebook中运行.py文件,快速打开ipython文件的方法 ...

  9. 驱动开发:内核读取SSDT表基址

    在前面的章节<X86驱动:挂接SSDT内核钩子>我们通过代码的方式直接读取 KeServiceDescriptorTable 这个被导出的表结构从而可以直接读取到SSDT表的基址,而在Wi ...

  10. Python 实现专属字典生成器

    编写一个密码生成工具,这里我们使用弱密码与个性化数组组合形成一个定制字典,例如收集用户的姓名,昵称,QQ号手机号等资源,然后通过Python对搜集到的数据与弱密码进行结合,从而定制出属于某个人的专属密 ...