django学习第九天---raw查询原生sql和python脚本中调用django环境和ORM锁和事务
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锁和事务的更多相关文章
- django系列5.4--ORM中执行原生SQL语句, Python脚本中调用django环境
ORM执行原生sql语句 在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询. Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回 ...
- Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境
目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...
- $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境
在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...
- Python--day69--pythonDjango终端打印SQL语句、在Python脚本中调用Django环境
Django终端打印SQL语句 在Django项目的settings.py文件中,在最后复制粘贴如下代码: LOGGING = { 'version': 1, 'disable_existing_lo ...
- Django框架(八)--单表增删改查,在Python脚本中调用Django环境
一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...
- 在Python脚本中调用Django环境
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", " ...
- Django框架----在Python脚本中调用Django环境
在项目根目录下新建脚本文件script.py import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTI ...
- 在Python脚本中调用Django环境(方便、右键运行,可用于ORM测试)
随便创建一个py文件即可: import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODUL ...
- django系列5.5--分组查询,聚合查询,F查询,Q查询,脚本中调用django环境
一.聚合查询 aggregate(*args, **args) 先引入需要的包,再使用聚合查询 #计算所有图书的平均价格 from django.db.models import Avg Book.o ...
- ORM基础3 在python脚本里调用Django环境
1.查询 1.# all获取所有的object,结果QuerySet,列表 print('all'.center(80, '=')) ret = models.Person.objects.all() ...
随机推荐
- Linux查看登录用户记录信息
Linux查看登录用户记录信息 登录成功的信息 last 可以简单统计一下: last |awk '{print $3}' |sort |uniq -c |sort -k1nr 登录失败的 就是 la ...
- [译]深入了解现代web浏览器(二)
本文是根据Mariko Kosaka在谷歌开发者网站上的系列文章https://developer.chrome.com/blog/inside-browser-part2/ 翻译而来,共有四篇,该篇 ...
- 结论&定理大全
定理 1:包含 \(0\) 与 \(2^k-1\) 的按位与或空间和 \(k\) 个点的有传递性的有向图形成双射 证明: 空间->传递闭包:对于任意两个位 \(i,j\),若某个数包含 \(i\ ...
- js加减乘除运算出现精度丢失
做乘法运算出现精度丢失 let aa= 2106.49 console.log( aa*10000 ) //21064899.999999996 console.log( Math.round(aa* ...
- web端用户的输入都应该做如下限制
web端中,所有可以输入的地方.都应该做如下操作. 1=>不能够输入script关键字,如果用户输入了.进行提示.然后删除用户输入的值 (这样比较粗暴,不太友好) 2=>用户输入了含有sc ...
- &&运算提高代码质量
sendGiveWeb: { code: 200, success: true, data: [ { id: "1230", name: "lh" }, { i ...
- go中的sync.RWMutex源码解读
读写锁 前言 什么是读写锁 看下实现 读锁 RLock RUnlock 写锁 Lock Unlock 问题要论 写操作是如何阻止写操作的 写操作是如何阻止读操作的 读操作是如何阻止写操作的 为什么写锁 ...
- TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用
TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术.提供便捷快速的知识蒸馏框架.提升模型的推理速度,减少内存占用 TextBrewer是一个基于PyTorch的.为实现NLP中的知识蒸 ...
- 强化学习基础篇【1】:基础知识点、马尔科夫决策过程、蒙特卡洛策略梯度定理、REINFORCE 算法
强化学习基础篇[1]:基础知识点.马尔科夫决策过程.蒙特卡洛策略梯度定理.REINFORCE 算法 1.强化学习基础知识点 智能体(agent):智能体是强化学习算法的主体,它能够根据经验做出主观判断 ...
- 3.3 Windows驱动开发:内核MDL读写进程内存
MDL内存读写是一种通过创建MDL结构体来实现跨进程内存读写的方式.在Windows操作系统中,每个进程都有自己独立的虚拟地址空间,不同进程之间的内存空间是隔离的.因此,要在一个进程中读取或写入另一个 ...