1.什麼是ORM
對象關係映射(Object Relational Mapping,簡稱 ORM )用於實現面向對象編程語言裏不同類型系統的數據之間的轉換。
ORM 在業務邏輯層和數據庫層之間充當了橋樑的作用。ORM 是通過使用描述對象和數據庫之間的映射的元數據,將程序中的對象自動持久化到數據庫中。
Django 模型使用自帶的 ORM。
1.1 使用ORM 的優點:
- 提高開發效率。
- 不同數據庫可以平滑切換。
1.2使用ORM 的缺點:
- ORM 代碼轉換為 SQL 語句時,需要花費一定的時間,執行效率會有所降低。
- 長期寫 ORM 代碼,會降低編寫 SQL 語句的能力。
1.3 ORM 解析過程:
- ORM 會將 Python 代碼轉成為 SQL 語句。
- SQL 語句通過 pymysql 傳送到數據庫服務端。
- 在數據庫中執行 SQL 語句並將結果返回。
ORM 對應關係表:
2.Django ORM使用方法
2.1 創建數據庫:在mysql命令行執行以下命令,創建一個名為"TH"的數據庫。
create database TH;
2.2 修改Django配置文件:在項目的 settings.py 文件中找到 DATABASES和INSTALLED_APPS配置項,將其信息修改為:
#文件名django_study.setting.py
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "TH", #數據庫名稱
"USER": "root",
"PASSWORD": "111111",
"HOST": "127.0.0.1",
"PORT": "3306"
}
}
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"app1",
]
2.3 告訴 Django 使用 pymysql 模塊連接 mysql 數據庫:在與 settings.py 同級目錄下的__init__.py中引入模塊和進行配置。
#文件名django_study.__init__.py
import pymysql
pymysql.install_as_MySQLdb()
2.4 定義模型:在app(本例應用名稱為app1)的model.py下定義類,類名代表了數據庫表名,且繼承了models.Model。
# 文件名:app1.models.py
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=20, primary_key=True)
age = models.IntegerField(default=0)
2.5 將 Django 項目中 models.py 文件的改動應用到數據庫中
python manage.py migrate(作用於全局)
python manage.py migrate app1(作用於應用)
命令執行成功,app1的migrations文件夾中生成0001_initial.py文件,mysql數據庫中添加了10張表。
如果出現django.db.utils.NotSupportedError: MySQL 8 or later is required 報錯,找到E:\Anaconda\Lib\site-packages\django\db\backends\base\base.py(其中E:\Anaconda替換為你的解釋器路徑),將以下版本檢查的函數註釋即可。
def init_connection_state(self):
"""Initialize the database connection settings."""
global RAN_DB_VERSION_CHECK
if self.alias not in RAN_DB_VERSION_CHECK:
# self.check_database_version_supported()
RAN_DB_VERSION_CHECK.add(self.alias)
2.6 通知Django模型有一些變更,模型有變更時,先makemigrations,後migrate。
python manage.py makemigrations
3.測試
自改應用app1的視圖函數如下,運行Django項目,然後在瀏覽器地址欄輸入測試接口對應的URL。
文件名:app1.views.py
from django.shortcuts import render
from django.http import HttpResponse
from app1.models import Test
# Create your views here.
def function1(request):
t = Test(name="func1", age=8)
t.save()
return HttpResponse("function1")
def function2(request):
t = Test(name="func2", age=4)
t.save()
return HttpResponse("function2")
app1.Test表中生成兩條記錄: