Django中如何使用游标对象执行原生SQL操作数据库进行(增删改查)操作!

什么是游标cursor

在django中, 我们可以使用游标对象 cursor 来执行最原始的SQL语句, 这样可以处理更为复杂并且orm 不方便的数据库操作,

首先需要将 connection对象导入进来,因为需要用它来创建一个游标对象 cursor

from django.db import connection

使用connection中的cursor() 方法, 就能创建出一个cursor对象, 使用这个对象, 我们就可以轻易的执行原生SQL语句, 对数据库的增删改查等操作了

查询数据:

首先, 通过connection.cursor() 得到一个游标对象, 然后定义一个 原生SQL 变量, 使用这个游标对象调用 execute() 方法,  即可执行原生SQL来进行查询数据了, 这里有一个小小的重点需要介绍一下:

        fetchone() 方法只返回一条数据, 还有一个方法是fetchall() 表示返回全部数据, 当然, 它们返回的数据形式是一个元组

from django.db import connection

cursor = connection.cursor()

sql = '''
    select * from tb
'''

cursor.execute(sql)

row = cursor.fetchone()
print(row)

cursor.close()

插入数据:

使用游标对象插入数据时使用 %s 占位符可以防止SQL注入的情况发生

from django.db import connection


cursor = connection.cursor()

sql = '''
    insert into tb (name, age, address) values (%s, %s, %s)
'''

data = ("张三", "33", "中国")

cursor.execute(sql, data)
cursor.close()

更新数据:

更新数据同样使用 %s 占位符的形式来避免SQL注入, 但是需要注意的是, 这里涉及到一个事务的情况, 如果更新成功则提交, 否则回滚, 保证数据点一致性,完整性。

from django.db import connection

cursor = connection.cursor()

try:
    sql = '''
        update tb set username=%s where id=%s
    '''
    data = ("李四", 3)
    cursor.execute(sql, data)
    rowcount = cursor.rowcount # 获取影响的行数    
    cursor.commit()    

except Exception as e:

    cursor.rollback() # 失败则回滚

删除数据:

删除数据同更新数据一样, 使用%s 占位符的形式,并且可以通过 rowcount 属性来获取影响的行数

from django.db import connection

cursor = connection.cursor()

sql = '''
    delete from tb where username=%s
'''

data = ["王五"]

cursor.execute(sql, data)
cursor.close()

django中事务的处理:

装饰器形式:

装饰器的形式, 只是声明当前视图函数支持事务操作, 并不是装饰了就直接能够自动进行commit或者rollback 了。

在django中, 已经封装好了对应的模块来处理事务的业务, 所以首先需要先导包:

from django.db import transaction

@transaction.atomic
def demo(request):

    # 开启事务
    save_id = transaction.savepoint()
    
    try:
        ...
        ...
        # 如没异常,提交从保存点到当前状态的所有数据库事务操作
        transaction.savepoint_commit(save_id)
    except:
        # 如有异常, 事务回滚
        transaction.savepoint_rollback(save_id)
with 语句方式开启事务:
from django.db import transaction


def demo(request):

    with transaction.atomic():

        # 开启事务
        save_id = transaction.savepoint()
    
        try:
            ...
            ...
            # 如没异常,提交从保存点到当前状态的所有数据库事务操作
            transaction.savepoint_commit(save_id)
        except:
            # 如有异常, 事务回滚
            transaction.savepoint_rollback(save_id)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_文书先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值