什么是游标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)