Django的ORM实现数据库事务操作
在Django中实现数据库的事务操作
在学习MySQL数据库时,MySQL数据库是支持原子操作的.
什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费.
交易正常时,银行在消费者的账户里减去相应的款项,在商户的帐户加上相应的款项.
但是如果银行从消费者的账户里扣完钱之后,还未在商户的帐户里加上相应的款项时.
由于某些原因,系统或者数据库出现异常了,那么此时钱已经从消费者的账户里扣除了,但是商户的账户里却没有加上相应的款项,让会让商户遭受损失.
这种情况下,最好的解决办法就是使用数据库的原子性操作.
如果数据库使用了事务操作,当出现上面的操作异常时,待数据库正常运行后,数据库系统会把先前执行了一半的操作退回到这个操作之前的状态,
这个通常称为数据库的回滚,也即数据库的原子性操作.
Django中,正常的数据库操作应该是原子性操作的.
在Django的ORM中,想使用事务操作时,要先导入一个Django的内置模块
from django.db import transaction
首先创建一个项目test,项目中有一个应用app01.
项目的model为:
from django.db import models
class Userinfo(models.Model):
username=models.CharField("用户名",max_length=32)
email=models.EmailField("邮箱",max_length=32)
class Group(models.Model):
title=models.CharField("组名",max_length=32)
配置好url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/',views.index),
]
路由对应的视图函数为
from django.shortcuts import render,HttpResponse
from . import models
def index(request):
from django.db import transaction
try:
with transaction.atomic():
models.Userinfo.objects.create(username="python001",email="python001@qq.com")
models.Group.objects.create(title="python002")
except Exception as e:
return HttpResponse("出现错误....")
return HttpResponse("ok")
首在先浏览器中打开http://127.0.0.1:8000/index/,浏览器的页面上出现

打开对应的数据库可以看到,UserInfo数据表和Group数据表中已经添加一条记录


现在修改视图函数,使程序出现运行错误,
from django.shortcuts import render,HttpResponse
from . import models
def index(request):
from django.db import transaction
try:
with transaction.atomic():
models.Userinfo.objects.create(username="python001",email="python001@qq.com")
models.Group.objects.create(title="python002")
except Exception as e:
return HttpResponse("出现错误....")
return HttpResponse("ok")
再次刷新浏览器,可以看到

而刷新两张数据表,可以看到两张数据库都没有添加数据记录.


这就是Django的ORM所支持的事务操作.!
Django的ORM实现数据库事务操作的更多相关文章
- django基础之day05,orm字段参数,自定义需要的字段,orm中的事务操作
orm字段和参数 charfield varchar integerfield int bigintegerfield bigint emailfield varchar(254) datefield ...
- Django中ORM对数据库的增删改查
Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...
- django 中连接mysql数据库的操作步骤
django中连接mysql数据库的操作步骤: 1 settings配置文件中 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mys ...
- Spring事务传播及数据库事务操作
从Spring 事务配置说起 先看看Spring 事务的基础配置 <aop:aspectj-autoproxy proxy-target-class="true"/> ...
- TP5数据库事务操作
使用事务处理的话,需要数据库引擎支持事务处理.比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎. 使用 transaction 方法操作数据库事务,当发生异常会自动回滚 ...
- Django之ORM对数据库操作
基本操作 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): ...
- Django框架之ORM(数据库)操作
一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例 ...
- Django中ORM对数据库的增删改查操作
前言 什么是ORM? ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...
- django notes 六:数据库 CRUD 操作
CRUD 也没什么可说的,django 提供了完善的 orm api, 直接用就行了. 我只贴几个列子,一看就明白了,自己再用用就熟了. # create b = Blog(name='Beatle ...
随机推荐
- python写一个网页翻译器
import urllib.requesturl='https://fanyi.baidu.com/v2transapi'data={}data['i']=opdata['from']='AUTO'd ...
- BZOJ2565: 最长双回文串(回文树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 记录一下每个点往前最长延伸位置,正反两遍,枚举分割点. #include<cstr ...
- UE4 字符串的转换
创建Fstring: FString TestHUDString = FString(TEXT("This is my test FString.")); FString,FNam ...
- 常用 Git 命令清单
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命 ...
- designed principle
Review Of designed Pattern principle OutLine: Explanation in principles of designed pattern and usef ...
- 懒人小技巧, Toad 常用偷懒方法
用toad很久了, 感叹它的功能强大的同时整理了一些相关技巧, 有以前在网上看到的也有自己平时用的时候偶尔发现的, 分享一下, 它对用户体验方面做的真的很到位, 通过各种方式来方便用户的操作. 菜鸟 ...
- 使用logrotate分割tomcat日志
转:https://www.52os.net/articles/using-logrotate-manage-tomcat-logs.html July 28, 2014 日志是Linux系统中最重要 ...
- 浅谈Android进阶之路
过去十年是移动互联网蓬勃发展的黄金期,相信每个人也都享受到了移动互联网红利,在此期间,移动互联网经历了曙光期.成长期.成熟期.现在来说已经进入饱和期.依然记得在 2010-2013 年期间,从事移动开 ...
- redis五大类型用法
Redis五大类型:字符串(String).哈希/散列/字典(Hash).列表(List).集合(Set).有序集合(sorted set)五种Controller:@Resource RedisTe ...
- restful 风格的理解
rest 其实就是representation status transfer(表现层状态转换) restful 风格的API具有如下特征: 1. 每个URI 包含一种资源,而且URI ...