Django连接数据库之原生SQL使用!如何在Django中使用原生MySQL? ✧*。٩(ˊᗜˋ*)و✧*。 Django初体验

Django与数据库介绍

Django连接数据库有两种方式,一直是直接调用原生MySQL数据库进行连接,使用SQL语句和数据库交互进行数据的获取。除此之外,我们还可以使用ORM模型进行连接。之后我会专门写一篇文章介绍ORM模型,当前我们先来看一下如何使用原生MySQL连接数据库。
使用原生SQL连接在真实项目中很少会出现,虽然ORM模型连接数据库因为存在二次转换性能会有小幅度损耗,但在电脑性能越来越强大的今日,因为二次转换所带来的损耗已经可以小到忽略不计的地步了。所以下方我就简单介绍一下连接方法和写一个案例。之后我会重点写一篇ORM模型的使用方法。

简单连接

连接MySQL需要使用pip下载连接库,这里我用的是PyMySQL,如果你常用其他的MySQL库,操作方法大致相同,你可以选用你自己常用的库或看我写的pymysql使用方法教程
下载好后我们可以直接在视图中调用MySQL语句进行使用
如下列代码:

from django.shortcuts import render
from pymysql import *
# Create your views here.


class DBMS:
    """连接数据库"""
    def __init__(self):
        self.con = connect(host='127.0.0.1', user='root', passwd='root', port=3306, db='django的数据库', charset='utf8')

    def data_all(self):
        cur = self.con.cursor()
        cur.execute("select * from django测试表")
        return cur.fetchall()


数据库 = {
    '数据库值': DBMS().data_all(),
}


def home(request):
    return render(request, 'home.html', context=数据库)

如果你对使用Python操作数据库有所了解,上面代码写的已经算是相当简单了。
这里需要注意的是,使用Django框架是调用MySQL事务会自动提交,不需要使用.commit()进行提交。

模拟案例

需求

下面我们写一个模拟案例来更深刻的理解如何在使用Django配合数据库。
目标:

  1. 显示数据库中的角色信息

  2. 点击角色信息进入角色信息详情页面

  3. 可以添加角色信息
    添加信息的时候会触发CSRF验证,当前我们先在设置(settings.py)中注释掉'django.middleware.csrf.CsrfViewMiddleware',即可关闭CSRF验证

  4. 可以删除角色信息

模板页面

分析,根据目标,我们需要三个页面,分别是首页,角色信息添加页面,角色详情页面
可以先做一个模板页面叫tamplate.html如下

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    {% block title %}
    <title>模板页面</title>
    {% endblock %}
</head>
<body>
    <h1><a href="/">点击进入首页</a></h1>
    <h2><a href="{% url 'DBMS:add' %}">点击添加新角色</a></h2>
    {% block body %}

    {% endblock %}
</body>
</html>

url路由设置

然后可以先把路由定义出来,详情页面和删除页面都需要指定值才能进行,所以这里将其设为携参模式。

from django.urls import path
from . import views

app_name = 'DBMS'

urlpatterns = [
    path('', views.home, name='home'),
    path('content/<uid>', views.content, name='content'),
    path('pop/<uid>', views.pop, name='pop'),
    path('add/', views.add, name='add')
]

定义视图

视图这块我先把数据库调用写成了一个类,之后在对此类进行调用,其中add对于初学者看上可能会比较复杂,这里简单讲解一下,首先是request.method的作用是判断当前请求为什么形式,这里我做了一个判断,如果是post请求,则代表是添加内容的请求,直接将接收到的值传入数据库并重定向回首页,如果是get请求,则为其他页面点击进入添加页面。还有删除页面只需要在必要时候进行数据删除即可,无需单独页面即可。

from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse
from pymysql import *

# 数据库调用
class DBMS:
    """连接数据库"""
    def __init__(self):
        self.con = connect(host='127.0.0.1', user='root', passwd='root', port=3306, db='django的数据库', charset='utf8')

    def all_data(self):
        """查询所有数据"""
        cur = self.con.cursor()
        cur.execute("select * from django测试表")
        return cur.fetchall()

    def one_data(self, num):
        """查询某条数据"""
        cur = self.con.cursor()
        cur.execute("select * from django测试表 where id={}".format(num))
        return cur.fetchone()

    def pop_data(self, num):
        """删除数据"""
        cur = self.con.cursor()
        cur.execute("delete from django测试表 where id={}".format(num))
        return '删除成功'

    def add_data(self, name, detailed):
        """添加一条信息"""
        cur = self.con.cursor()
        cur.execute("insert into django测试表 values(0,'{}','{}')".format(name, detailed))
        return '添加成功'



def home(request):
    # 如果字典放在外面数据库就不会在每次进入页面时刷新,只有重启项目时才会刷新
    数据库 = {
        '角色数据': DBMS().all_data(),
    }
    return render(request, 'home.html', context=数据库)


def add(request):
    # 点击添加进入此页面时为get请求,直接跳转到添加页面即可,提交时为post请求,这时候我们就需要接收值并重定向到首页
    if request.method == 'POST':
        # 接收页面中传入的值
        name = request.POST.get('name')
        detailed = request.POST.get('detailed')
        # 将值添加进入数据库
        DBMS().add_data(name, detailed)
        # 这里使用重定向到首页(重定向时URL会发生改变,使用render时只会渲染页面,不会改变URL)
        return redirect(reverse('DBMS:home'))
    else:
        return render(request, 'add.html')


def content(request, uid):
    数据库 = {
        '角色数据': DBMS().one_data(uid),
    }
    return render(request, 'content.html', context=数据库)


def pop(request, uid):
    if uid:
        DBMS().pop_data(uid)
        return redirect(reverse('DBMS:home'))
    else:
        return HttpResponse('删除失败')

页面

首页

首页可以使用for循环进行表格循环,进行数据的自动填充

{% extends 'tamplate.html' %}
{% block title %}
<title>首页</title>
{% endblock %}
{% block body %}
<table>
    <tr>
        <th>序号</th>
        <th>角色</th>
        <th>删除</th>
    </tr>
{% for foo in 角色数据 %}
    <tr>
        <th>{{ forloop.counter }}</th>
        <th><a href="{% url 'DBMS:content' uid=foo.0 %}">{{ foo.1 }}</a></th>
        <th><a href="{% url 'DBMS:pop' uid=foo.0 %}">删除此角色</a></th>
    </tr>
{% endfor %}

</table>
{% endblock %}

详情页

详情页较为简单,就不做介绍了

{% extends 'tamplate.html' %}
{% block title %}
<title>详情页</title>
{% endblock %}
{% block body %}
    <h1>角色序号:  {{ 角色数据.0 }}</h1>
    <h2>角色名称: <br> {{ 角色数据.1 }}</h2>
    <h3>角色介绍: <br> {{ 角色数据.2 }}</h3>
    <a href="{% url 'DBMS:pop' uid=角色数据.0 %}">删除此角色</a>
{% endblock %}

添加角色页

添加角色需要用到form表单的post方式进行内容的传递

{% extends 'tamplate.html' %}
{% block title %}
<title>添加信息</title>
{% endblock %}
{% block body %}
    <form action="" method="post">
        昵称: <input type="text" name="name"><br>
        详情内容: <input type="text" name="detailed"><br>
        <input type="submit" value="提交">
    </form>
{% endblock %}

效果如下图
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寻_觅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值