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配合數據庫。
目標:
-
顯示數據庫中的角色信息
-
點擊角色信息進入角色信息詳情頁面
-
可以添加角色信息
添加信息的時候會觸發CSRF驗證,當前我們先在設置(settings.py)中註釋掉'django.middleware.csrf.CsrfViewMiddleware',
即可關閉CSRF驗證 -
可以刪除角色信息
模板頁面
分析,根據目標,我們需要三個頁面,分別是首頁,角色信息添加頁面,角色詳情頁面
可以先做一個模板頁面叫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 %}
效果如下圖