Django——模型层之原生sql,事务(请求,装饰器,局部)

一、原生sql

 # 原生sql(有些sql用orm写不出来)
    # 两种方案
    # 第一种:用的比较少

    # from django.db import connection
    #
    # cursor = connection.cursor(cursor=pymysql.cursors.DictCursor)
    #
    # cursor.execute("""SELECT * from app01_book where id = %s""", [1])
    #
    # # row = cursor.fetchone()
    # row = cursor.fetchall()
    # print(row)

    # 第二种,用的多
    # books=models.Book.objects.raw('select * from app01_book where id >3')
    # print(books)#RawQuerySet对象
    # for book in books:
    #     print(book.name)

    # books=models.Book.objects.raw('select * from app01_publish')
    # for book in books:
    #     print(book.__dict__)
        # print(book.name)
        # print(book.addr)
        # print(book.email)
        # print(book.price)

    # authors = models.Author.objects.raw('SELECT app01_author.id,app01_author. NAME,app01_authordetail.sex FROM app01_author JOIN app01_authordetail ON app01_author.author_detail_id = app01_authordetail.id WHERE app01_authordetail.sex = 1')
    # 
    # for author in authors:
    #     print(author.name)
    #     print(author.__dict__)

二、事务(请求,装饰器,局部)

# 事物:ACID,事物的隔离级别(搜),锁, 行级锁,表级锁

    # djanog orm中使用事物:原子性操作,要么都成功,要么都失败

    # 新增一个作者详情,新增一个作者

    # 事物的三个粒度
    # 1 局部使用
    from django.db import transaction
    with transaction.atomic(): # 都在事物中,要么都成功,要么都失败
        author_detail=models.AuthorDetail.objects.create(addr='xxx',phone='123',sex=1)
        # raise Exception('抛了异常')
        author=models.Author.objects.create(name='llqz',age=19,author_detail=author_detail)
    # 2 视图函数装饰器,这一个视图函数都在一个事物中
    # @transaction.atomic
    # def index(request):
    #     return HttpResponse('ok')


    # 3 整个http请求,在事物中,在setting.py中配置
    '''
    DATABASES = {
        'default': {
            ...
            'PORT': 3306,
            'ATOMIC_REQUEST': True,
       
        }
    }

    'ATOMIC_REQUEST': True,
设置为True统一个http请求对应的所有sql都放在一个事务中执行(要么所有都成功,要么所有都失败)。
    
    '''
原文地址:https://www.cnblogs.com/guojieying/p/13814903.html