Django基礎(六)———數據庫

前言

上篇文章給大家介紹了DTL模板結構

這篇文章將講述Django框架與MySQL數據庫的綜合使用


一、Django配置連接數據庫

在操作數據庫之前,首先先要連接數據庫,這里我們以配置MySQL為例來講解。Diango連接數據庫,不需要單獨的創建一個連接對象。 只需要在 settings.py 文件中做好數據庫相關的配置就可以了。

二、在Django中操作數據庫(原生SQL語句操作)

在Django 中操作數據庫有兩種方式。第一種方式就是使用原生SQL語句操作,第二種就是使用ORM模型來操作。
在Django中使用原生 SQL 語句操作其實就是使用 python db api的接口來操作。如果你的mysql驅動使用的是pymysql,那么你就是使用 pymysql來操作的,只不過Django將數據庫連接的這一部分封裝好了,我們只要在 settings.py中配置好了數據庫連接信息后直接使用Diango封裝好的接口就可以操作了。

1.安裝pymysql

pip install pymysql

2.在init.py文件當中寫上如下代碼

import pymysql
pymysql.install_as_MySQLdb()

3.編寫視圖函數

#app應用下的 view.py
def index(request):#獲取游標對象cursor = connection.cursor()#拿到游標對象后執行sql語句cursor.execute("select * from cangku")#獲取所有數據rows = cursor.fetchall()#便利查詢for row in rows:print(row)return HttpResponse("查找成功")

4.編寫路由

#app應用下的 urls.py
from django.urls import path
from . import viewsapp_name = 'app'
urlpatterns = [path('cangku',views.index,name='index')
]
#database應用下的 urls.py
from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('app/',include("app.urls"))
]

三、ORM模型介紹

1.ORM模型介紹

隨著項目越來越大,采用寫原生SQL的方式在代碼中會出現大量的SQL語句,那么問題就出現了

  1. SQL語句重復利用率不高,越復雜的SQL語句條件越多,代碼越長。會出現很多相近的SQL語句。

  2. 很多SQL語句是在業務邏輯中拼出來的,如果有數據庫需要更改,就要去修改這些邏輯,這會很容易漏掉對某些SQL語句的修改。

  3. 寫SQL時容易忽略web安全問題,給未來造成隱患。SQL注入。

ORM,全稱object Relational Mapping,中文叫做對象關系映射,通過 ORM我們可以通過類的方式去操作數據庫,而不用再寫原生的SQL語句。通過把表映射成類,把行作實例,把字段作為屬性,ORM在執行對象操作的時候最終還是會把對應的操作轉換為數據庫原生語句。使用ORM有許多優點:

  1. 易用性:使用ORM做數據庫的開發可以有效的減少重復SQL語句的概率,寫出來的模型也更加直觀、清晰.

  2. 性能損耗小:ORM轉換成底層數據庫操作指令確實會有一些開銷。但從實際的情況來看,這種性能損耗很少(不足5%),只要不是對性能有嚴苛的要求,綜合考慮開發效率、代碼的閱讀性,帶來的好處要遠遠大于性能損耗,而且項目越大作用越明顯。

  3. 設計靈活:可以輕松的寫出復雜的查詢。

  4. 可移植性: Django封裝了底層的數據庫實現,支持多個關系數據庫引擎,包括流行的MySQL、PostgresQL和 SQLite。可以非常輕松的切換數據庫。

2.創建ORM模型

ORM模型一般都是放在 app的 models.py文件中。每個app都可以擁有自己的模型。并且如果這個模型想要映射到數據庫中,那么這個 app必須要放在settings.py的INSTALLED_APP 中進行安裝。以下是寫一個簡單的倉庫ORM 模型。

#app應用中 models.py文件
from django.db import models
#電子產品
class Dianzichanpin(models.Model):objects = Nonename = models.CharField(max_length=100)factory =models.CharField(max_length=100)pub_time = models.DateTimeField(auto_now_add=True)price = models.FloatField(default=0)

3.映射模型到數據庫中

將 ORM 模型映射到數據庫中,總結起來就是以下幾步:

  1. 在settings.py中,配置好 DATABASES,做好數據庫相關的配置,

  2. 在 app 中的 mode1s.py中定義好模型,這個模型必須繼承自 django.db.models。

  3. 將這個app添加到settings.py的INSTALLED_APP中。

  4. 在命令行終端,進入到項目所在的路徑,然后執行命令 python manage.py makemigrations 來生成遷移腳本文件。

  5. 同樣在命令行中,執行命令 python manage.py migrate 來將遷移腳本文件映射到數據庫中。

四、CRUD操作

在 ORM框架中,所有模型相關的操作,比如添加/刪除等。其實都是映射到數據庫中一條數據的操作。因此模型操作也就是數據庫表中數據的操作。

1.添加一個模型到數據庫當中

編寫視圖函數

#app應用下 views.py
def add(request):Dianzi =Dianzichanpin(name='手機',factory='福建',price=1200)Dianzi.save()return HttpResponse("圖書插入成功")

編寫路由

#app應用下的 urls.pypath('add',views.add,name='add')

2.查找數據

查找數據都是通過模型下的 objects 對象來實現的。

2.1查找所有數據

要查找 Dianzichanpin 這個模型對應的表下的所有數據。

編寫視圖函數

#app應用下 views.py
def query(request):Dianzi = Dianzichanpin.objects.all()for Dian in Dianzi:print(Dian.id,Dian.name,Dian.pub_time,Dian.price)return  HttpResponse("查找成功")

編寫路由

#app應用下的 urls.pypath('query',views.query,name='query')

2.2數據過濾

在查找數據的時候,有時候需要對一些數據進行過濾。那么這時候需要調用objects的 filter 方法。

編寫視圖函數

def query(request):# Dianzi = Dianzichanpin.objects.all()Dianzi = Dianzichanpin.objects.filter(name='手機')for Dian in Dianzi:print(Dian.id,Dian.name,Dian.pub_time,Dian.price)return  HttpResponse("查找成功")

2.3獲取單個對象(多用于登陸注冊)

使用 filter返回的是所有滿足條件的結果集。有時候如果只需要返回第一個滿足條件的對象。那么可以使用 get方法。

編寫視圖函數

def query(request):Dianzi = Dianzichanpin.objects.get(name='手機')print(Dianzi.name)return  HttpResponse("查找成功")

2.4數據排序

在之前的例子中,數據都是無序的。如果你想在査找數據的時候使用某個字段來進行排序,那么可以使用order_by方法來實現。

編寫視圖函數

def query(request):Dianzi = Dianzichanpin.objects.order_by("pub_time")for Dian in Dianzi:print(Dian.name)return  HttpResponse("查找成功")

默認為從小到大排列,如果想要倒敘,在對應數據前面放上-號

3.修改數據

在查找到數據后,便可以進行修改了。修改的方式非常簡單,只需要將查找出來的對象的某個屬性進行修改,然后再調用這個對象的 save 方法便可以進行修改。

編寫視圖函數

def update(reuqest):Dianzi = Dianzichanpin.objects.first()Dianzi.name ='耳機'Dianzi.save()return HttpResponse('修改成功')

編寫路由

#app應用下的 urls.py
path('update',views.update,name='update')

4.刪除數據

在查找到數據后,便可以進行刪除了。刪除數據非常簡單,只需要調用這個對象的 delete方法即可

編寫視圖函數

def delete_(request):Dianzi = Dianzichanpin.objects.get(name='電子手表')Dianzi.delete()return HttpResponse('刪除成功')

編寫路由

path('delete',views.delete_,name='delete')

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89999.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89999.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89999.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

postgresql使用記錄 SCRAM authentication requires libpq version 10 or above

文章目錄 背景 如何用命令行連接數據庫 報錯 原因 解決方案 psql常見命令 ?? **核心數據庫操作命令** 1. **查看所有數據庫** 2. **切換數據庫** 3. **查看表及結構** 4. **執行 SQL 文件** 5. **退出 psql** ?? **高級管理命令** ? **注意事項** 背景 由于某種原因,無法…

2.0版本seata、nacos+ruoyi(微服務)配置

一、下載: seata下載:點擊這里 nacos下載:點擊這里 ruoyi(微服務)下載:點擊這里 Git bash下載:點擊這里 本文所用的版本: seata-2.2.0(下圖紅色框框)&a…

面試高頻題 力扣 LCR 130.衣柜整理 洪水灌溉(FloodFill) 深度優先遍歷(dfs) 暴力搜索 C++解題思路 每日一題

目錄零、題目描述一、為什么這道題值得一看?二、題目拆解:核心要素與約束三、算法實現:基于 DFS 的解決方案代碼邏輯拆解五、時間復雜度與空間復雜度時間復雜度空間復雜度六、坑點總結七、舉一反三八、洪水灌溉(Flood Fill&#x…

Ext4文件系統全景解析

目錄Ext4文件系統全景解析:從inode到數據恢復實戰1. Ext文件系統的"小區規劃":塊組結構詳解 🏘?1.1 塊組:文件系統的基本管理單元1.2 超級塊的"多重備份"機制 🛡?2. inode:文件的&qu…

貪心算法Day4學習心得

先來看第一道:860. 檸檬水找零 - 力扣(LeetCode) 有如下三種情況: 情況一:賬單是5,直接收下。情況二:賬單是10,消耗一個5,增加一個10情況三:賬單是20&#…

接口自動化測試種涉及到接口依賴怎么辦?

《接口自動化測試中接口依賴的處理方式及選擇原則》在接口自動化測試中,接口依賴是指某個接口的請求參數、執行條件或測試結果依賴于其他接口的輸出(如返回數據、狀態等)。處理接口依賴是確保測試用例準確性和穩定性的關鍵,常見的…

hive分區表臨時加載日批數據文件

源系統每日上傳一個csv數據文件到數據中臺指定目錄,數據中臺用hive表進行ETL工作。 先建一個外部分區表: create external table tmp_lease_contract ( contract_id string, vin string, amount float ) partitioned by (dt string) row format delim…

Python關于pandas的基礎知識

一.掃盲(一)、pandas 是什么pandas 是 Python 的一個第三方數據處理庫,它提供了高效、靈活的數據結構(如 Series 和 DataFrame),能方便地對結構化數據進行清洗、轉換、分析和處理。(二&#xff…

React 英語單詞補全游戲——一個寓教于樂的英語單詞記憶游戲

預覽:英語單詞補全 📖 產品概述 英語單詞大冒險是一款專為 7-12 歲兒童設計的互動式英語學習游戲。通過聽音頻、補全單詞的游戲方式,讓孩子在輕松愉快的環境中提升英語詞匯能力和聽力水平。 🎯 核心價值主張 寓教于樂: 將枯燥…

我的第一個開源項目 -- 實時語音識別工具

這是我的第一個開源項目,是我一直想做的一個小工具: 端到端實時語音轉文字系統。 通過小程序和H5頁面,用戶可以實時采錄音頻,通過ws上傳到java的netty server。 Java在經過權限驗證、流量控制等操作之后,通過gRPC流…

AG32 mcu+cpld 聯合編程(概念及流程)

在使用mcucpld聯合編程之前,請確認已經熟練掌握mcu的使用方法,并且對cpld編程(verilog語言)有一定的基礎。 另外,對AHB總線也需要有一定的了解。 這個章節分為兩部分: 第一部分,展示聯合編程…

Hadoop調度器深度解析:FairScheduler與CapacityScheduler的優化策略

Hadoop調度器概述在大數據處理的生態系統中,Hadoop作為分布式計算框架的核心,其資源調度機制直接決定了集群的吞吐效率和作業執行公平性。調度器作為Hadoop資源管理的中樞神經,通過協調計算資源與任務需求之間的動態平衡,成為支撐…

怎么自己搭建云手機

用閑置電腦搭建云手機 確保電腦安裝 Ubuntu 20.04(或其他支持Docker的Linux系統)。 安裝 Docker(運行云手機的核心工具)安裝Redroid(安卓容器)運行安卓容器就歐克啦。 用云服務器搭建(適合長…

網關:數據翻譯、中轉、協議轉換與邊緣計算

網關(Gateway)詳解:翻譯與中轉站的核心作用 在計算機網絡中,網關(Gateway)是一個非常重要的概念。它本質上是一個“翻譯中轉站”,其主要作用是將不同網絡之間的數據進行“翻譯”,并確…

UE5多人MOBA+GAS 番外篇:使用ECC(UGameplayEffectExecutionCalculation)制作傷害計算的流程

文章目錄定義一些屬性用于作為傷害基礎還有獲取要打出去的傷害創建一個ECC(里面執行傷害的計算)在執行ECC的GE之前需要修改ECC需要調用的值,也可以不改直接計算在屬性中監聽ECC輸出的那個值然后處理扣血定義一些屬性用于作為傷害基礎還有獲取…

SpringBoot實戰0-5

接口文檔:通俗的講,接口文檔能告訴開發者接口能返回的數據,以及為了獲取這些數據,開發者需要輸入什么樣的數據,請求哪個接口(即規范)為什么使用接口文檔:1、項目開發過程中前后端工程…

二、SpringBoot-REST開發

rest開發(表現形式轉換): 1、優點:隱藏訪問資源的行為,無法通過地址得知對資源是何種操作,書寫簡化 2、GET查詢 POST 新增/保存 PUT(修改/更新) DELETE(刪除)…

大數據之路:阿里巴巴大數據實踐——離線數據開發

數據開發平臺 統一計算平臺MaxCompute:主要服務于海量數據的存儲和計算 ,提供完善的數據導入方案, 以及多種經典的分布式計算模型,提供海量數據倉庫的解決方案,能夠更快速地解決用戶的海量數據計算問題,有效…

我的網頁聊天室設計

一、需求分析1.用戶管理模塊注冊功能實現一個注冊頁面。注冊頁面上包含了一個輸入框,輸入用戶名和密碼. 注冊成功后可以跳轉到登錄頁面.登錄功能實現一個登錄頁面。登錄頁面上包含一個輸入框。輸入用戶名和密碼. 登錄成功后可以跳轉到主頁面.2.主界面用戶信息左上角…

數據結構自學Days10 -- 二叉樹的常用實現

? 一、為什么要學習二叉樹? 1. 📦 組織數據的高效方式 二叉樹可以快速插入、刪除、查找數據,尤其在平衡時,時間復雜度為 $O(\log n)$。 適合表示分層結構(如組織結構、文件系統、語法樹)。 2. &#x…