Python Django 之 直接执行自定义SQL语句(二)

转载自:https://my.oschina.net/liuyuantao/blog/712189

一般来说,最好用 Django 自带的模型来实现这些操作。这里仅仅只是为了学习使用原始 SQL 而做的练习。

Django 提供了非常方便的数据管理模型 models,可以完成与数据库的基本操作。但有时,Django 原始的 models 的功能可能会不太够用,这些情况下可以直接绕过模型直接访问数据库。

Django提供两种方式执行(performing)原始的SQL查询:

  • Manager.raw():执行原始查询并返回模型实例
  • Executing custom SQL directly:直接执行自定义SQL,这种方式可以完全避免数据模型,而是直接执行原始的SQL语句。

先上程序,再解释。

下面的函数,获取表单传递过来的 POST 数据,然后执行 Insert/Update 操作。

from django.views.decorators.csrf import csrf_exempt
from django.db.transaction import commit_on_success
import MySQLdb @csrf_exempt @commit_on_success def add_post(request): from django.db import connection, transaction title = request.POST.get('title', False) vicetitle = request.POST.get('vice_title', False) digest = request.POST.get('digest', False) content = request.POST.get('content', False) db = MySQLdb.connect(user='root', db='testdb', passwd='', host='localhost', charset='utf8') #cursor = db.cursor() cursor = connection.cursor() #cursor.execute("INSERT INTO nowamagic (title, vicetitle, digest, content) values (%s, %s, %s, %s)", [title, vicetitle, digest, content]) cursor.execute("UPDATE chika SET title = '3333' WHERE id = '2'") transaction.commit_unless_managed() #transaction.set_dirty() db.close() return render_to_response('test.html', context_instance=RequestContext(request))

一些语句的大概解释:

  • django.db.connection,代表了默认的数据库连接,
  • django.db.transaction,代表默认的数据库事务。
  • counnection.cursor,代表默认数据库游标。
  • cursor.execute(sql,[params]),执行sql语句。
  • cursor.fetchone()或cursor.fetchall(),返回查询的结果。
  • transaction.commit_unless_managed(),事务提交,确保数据更改(在更改数据库时使用,如果查询操作没必要使用)

如果你正在使用事务装饰器(例如 commit_on_success)来修饰视图和提供事务控制。你不必手动调用 transaction.commit_unless_managed(),当然如果你愿意的话,可以手动调用,但是一般情况下用不着这么做,这是因为装饰器会为你自动提交事务。但是,如果你不手动提交修改,你需要使用 transaction.set_dirty() 将事务标识为已脏。

@commit_on_success
def my_custom_sql_view(request, value): from django.db import connection, transaction cursor = connection.cursor() # Data modifying operation cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [value]) # Since we modified data, mark the transaction as dirty transaction.set_dirty() # Data retrieval operation. This doesn't dirty the transaction, # so no call to set_dirty() is required. cursor.execute("SELECT foo FROM bar WHERE baz = %s", [value]) row = cursor.fetchone() return render_to_response('template.html', {'row': row})

使用 Django ORM 对数据库进行修改时,Django 会自动调用 set_dirty() 。但如果你使用了原始 SQL ,Django 就无法获得你的 SQL 是否修改了数据。只有手动调用 set_dirty() 才能确保 Django 知晓哪些修改必须被提交。

转载于:https://www.cnblogs.com/xibuhaohao/p/10376479.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些关于 Django + layui + 原生 SQL 语句实现登录的详细信息。 首先,Django 是一个基于 Python 的 Web 应用程序框架,它可以帮助您快速地构建 Web 应用程序。Layui 是一个流行的前端 UI 框架,它提供了许多易于使用的 UI 组件和样式。原生 SQL 语句是一种直接数据库进行交互的方式,它可以让您更加灵活地操作数据。 下面是一些实现登录的步骤: 1. 创建 Django 项目并安装必要的包,包括 Django、pymysql 等。 2. 定义数据库模型,可以使用 Django 自带的 ORM,也可以使用原生 SQL 语句。例如,可以创建一个名为 User 的模型,其中包含用户名和密码: ```python class User(models.Model): username = models.CharField(max_length=50) password = models.CharField(max_length=50) ``` 3. 创建登录页面,并使用 Layui 的表单组件和 AJAX 技术提交表单数据。 4. 在后端编写登录验证逻辑,可以使用原生 SQL 语句查询数据库中是否存在对应的用户名和密码。 ```python def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = User.objects.raw('SELECT * FROM user WHERE username=%s AND password=%s', [username, password]) if user: # 登录成功 return JsonResponse({'code': 0, 'msg': '登录成功'}) else: # 登录失败 return JsonResponse({'code': 1, 'msg': '用户名或密码错误'}) ``` 5. 在前端根据后端返回的结果进行相应的处理,例如跳转到首页或者显示错误提示信息。 希望这些信息能对您有所帮助,如有任何问题或需要进一步了解,请随时告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值