一、前提說明
1、基於DjangoTest項目演練
2、已經安裝了mysql驅動,若未安裝可以執行安裝命令:pip install pymysql
3、已在navicat手動創建了數據庫order_test(由於Django自帶的orm是data_first類型的ORM,使用前必須先創建數據庫)
4、其他說明
Django框架功能齊全自帶數據庫操作功能,本文主要介紹Django的ORM框架,到目前爲止,當我們的程序涉及到數據庫相關操作時,我們一般都會這麼搞:
- 創建數據庫,設計表結構和字段
- 使用 MySQLdb 來連接數據庫,並編寫數據訪問層代碼
- 業務邏輯層去調用數據訪問層執行數據庫操作
ORM:Object Relational Mapping(關係對象映射)
類名對應------》數據庫中的表名
類屬性對應---------》數據庫裏的字段
類實例對應---------》數據庫表裏的一行數據
二、修改setting.py
在項目的 settings.py 文件中找到 DATABASES 配置項,將其信息修改爲如下:
DATABASES = { 'default': { #'ENGINE': 'django.db.backends.sqlite3', #'NAME': BASE_DIR / 'db.sqlite3', #修改DATABASES 配置項 'ENGINE': 'django.db.backends.mysql', # 數據庫引擎 'NAME': 'order_test', # 數據庫名稱 'HOST': '12.18.20.42', # 數據庫地址,本機 ip 地址 127.0.0.1 'PORT': 13306, # 端口 'USER': 'doud', # 數據庫用戶名 'PASSWORD': 'cNiryBWa', # 數據庫密碼 } }
三、修改__init__.py
告訴 Django 使用 pymysql 模塊連接 mysql 數據庫,設置 Django默認連接MySQL的方式
# 在與 settings.py 同級目錄下的 __init__.py 中引入模塊和進行配置 import pymysql pymysql.install_as_MySQLdb()
四、定義模型
1、創建APP
Django 規定,如果要使用模型,必須要創建一個 app。我們使用以下命令創建一個 TestModel 的 app
django-admin startapp TestModel
2、修改 TestModel/models.py 文件,創建表
類名Test代表了數據庫表名,且繼承了models.Model,類裏面的字段代表數據表中的字段(name),數據類型則由CharField(相當於varchar)、DateField(相當於datetime), max_length 參數限定長度。
注:說通俗點,就是name字段是創建表時要定義的字段
from django.db import models # Create your models here. class Test(models.Model): name = models.CharField(max_length=20)
3、修改 DjangoTest/settings.py
在 settings.py 中找到INSTALLED_APPS這一項,修改如下,即註冊APP:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'TestModel', #添加此項 ]
4、執行創建表結構的命令
只要模型文件models.py進行了內容的更新,我們都會使用python manage.py makemigrations 和 python manage.py migrate這兩個命令
1)python manage.py makemigrations TestModel
當我們第一次在models.py文件新建model類(一個類對應數據庫中的一張數據表)時,執行python manage.py makemigrations 命令之後,應用目錄下的migations的文件下多了一個001的文件。文件內容記錄了我們剛纔在medels.py文件的操作
2)python manage.py migrate TestModel
執行了第1步的命令後,數據庫裏是沒有TestMode_test模型的表的,此時要再執行python manage.py migrate,刷新數據庫可以看到新建好的數據表,數據表中字段也出現了
下圖是表結構,表名組成結構爲:應用名_類名(如:TestModel_test)
注意:儘管我們沒有在 models 給表設置主鍵,但是 Django 會自動添加一個 id 作爲主鍵。
3)問題:兩個命令的關係?可以只執行其中一個命令嗎?
答案:首先,第一個命令的作用是記錄即將要做的數據庫操作,但實際上並沒有進行數據庫操作。第二個的命令的作用是對數據庫進行操作(建表、改表等)
綜上:python manage.py makemigrations命令記錄對models文件的修改。python manage.py migrate命令在數據庫中創建表和數據
五、數據庫操作
1、編輯TestModel/tests.py
直接用現有的tests.py文件實戰演練就行了,懶得再創建多1個文件。
tests.py源碼如下,包含:1)添加數據:需要先創建對象,然後再執行 save 函數,相當於SQL中的INSERT;2)獲取數據
from django.test import TestCase # Create your tests here. # -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # 數據庫操作:添加數據 def testdb(request): test1 = Test(name='lijun') test1.save() return HttpResponse("<p>數據添加成功!</p>") # 數據庫操作:獲取數據 def querry(request): # 初始化 response = "" response1 = "" # 通過objects這個模型管理器的all()獲得所有數據行,相當於SQL中的SELECT * FROM list = Test.objects.all() # filter相當於SQL中的WHERE,可設置條件過濾結果 response2 = Test.objects.filter(id=1) # 獲取單個對象 response3 = Test.objects.get(id=1) # 限制返回的數據 相當於 SQL 中的 OFFSET 0 LIMIT 2; Test.objects.order_by('name')[0:2] # 數據排序 Test.objects.order_by("id") # 上面的方法可以連鎖使用 Test.objects.filter(name="runoob").order_by("id") # 輸出所有數據 for var in list: response1 += var.name + " " response = response1 return HttpResponse("<p>" +"查詢數據庫返回的數據爲:"+ response + "</p>")
2、修改DjangoTest/urls.py
from django.contrib import admin from django.urls import path from DjangoTest import views from TestModel import tests urlpatterns = [ path('admin/', admin.site.urls), path('123/',views.student),# 訪問視圖的student對象,student對象指向的是HelloWorld.html path('122/',views.hello) ,# 訪問的是視圖的hello對象,hello對象使用的是HttpResponse直接返回的值 path('111/',tests.testdb), # 訪問的是TestModel應用的tests文件下的testdb對象 path('112/',tests.querry) # 訪問的是TestModel應用的tests文件下的querry對象 ]
3、瀏覽器訪問
1)訪問添加數據的地址 http://127.0.0.1:8000/111/
如下圖,訪問後返回數據添加成功,此時數據庫表會insert一條數據
2)訪問獲取數據的地址http://127.0.0.1:8000/112/
以上便講述完成如何使用mysql數據庫,至於更新或刪除數據,可參考https://www.runoob.com/django/django-model.html,這裏不再演示了