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 %}

效果如下圖
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章