現代 Web 應用開發中,容器化和資料函式倉管理至關重要。本文結合 FastAPI 和 Docker,提供簡化佈署流程、提升開發效率的解決方案。同時,深入比較 MySQL、PostgreSQL 和 MongoDB 的特性,協助開發者根據應用需求選擇合適的資料函式庫。文章也涵蓋資料函式庫設計原則、正規化、ER 模型以及 CRUD 操作的 SQL 實作,提供全面的資料函式倉管理最佳化策略。透過 Docker 容器化 FastAPI 應用,開發者可確保應用在不同環境中的一致性,簡化測試和開發流程。文章詳細說明 Docker 的安裝步驟、Dockerfile 的撰寫以及建構和執行 Docker 映像檔的指令,讓開發者快速上手。
FastAPI 與 Docker 整合實務
在現代軟體開發中,容器化技術已成為提升應用程式可攜性和可擴充套件性的關鍵。FastAPI 與 Docker 的結合,能夠為開發者提供一致且穩定的執行環境,簡化佈署流程並提升開發效率。
為何需要 Docker 容器化 FastAPI 應用程式?
將 FastAPI 應用程式容器化,可以將應用及其依賴完整封裝於 Docker 容器中。這種做法不僅簡化了測試和開發流程,還能確保應用在不同環境中的相容性和一致性。
安裝 Docker 環境
在開始容器化 FastAPI 應用之前,需先在開發環境中安裝 Docker。以下是在 Ubuntu 系統上安裝 Docker 的步驟:
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
安裝完成後,將目前使用者加入 Docker 群組,以避免每次執行 Docker 命令時都需要使用 sudo:
sudo usermod -aG docker ${USER}
su - ${USER}
內容解密:
sudo apt update更新套件列表,確保系統取得最新的軟體資訊。sudo apt install docker.io安裝 Docker 套件。sudo systemctl start docker啟動 Docker 服務。sudo systemctl enable docker設定 Docker 開機自動啟動。sudo usermod -aG docker ${USER}將目前使用者加入 Docker 群組,簡化操作流程。
建立 FastAPI 的 Dockerfile
在 FastAPI 專案的根目錄中建立一個名為 Dockerfile 的檔案,用於定義如何建構 Docker 映像檔:
# 使用官方 Python 3.8 映像檔作為基礎
FROM python:3.8
# 設定容器中的工作目錄
WORKDIR /code
# 將目前目錄的內容複製到容器中的 /code 目錄
COPY ./ /code
# 安裝 requirements.txt 中指定的依賴套件
RUN pip install --no-cache-dir -r requirements.txt
# 將容器的 8000 連線埠對應到外部
EXPOSE 8000
# 定義環境變數
ENV NAME World
# 使用 Uvicorn 執行 FastAPI 應用程式
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
內容解密:
FROM python:3.8指定使用 Python 3.8 作為基礎映像檔。WORKDIR /code在容器中建立/code目錄並設為工作目錄。COPY ./ /code將主機上的專案檔案複製到容器的工作目錄。RUN pip install --no-cache-dir -r requirements.txt安裝專案所需的 Python 套件。EXPOSE 8000將容器的 8000 連線埠開放給外部存取。CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]設定容器啟動時執行的命令,使用 Uvicorn 啟動 FastAPI 應用。
建構 Docker 映像檔
在包含 Dockerfile 的目錄中執行以下命令,以建構 Docker 映像檔:
docker build -t fastapi-app .
此命令會根據目前目錄中的 Dockerfile 建構映像檔,並將其標記為 fastapi-app。
內容解密:
docker build命令用於根據 Dockerfile 建構映像檔。-t fastapi-app將建構的映像檔標記為fastapi-app。
在 Docker 容器中執行 FastAPI 應用程式
建構完成後,使用以下命令在 Docker 容器中啟動 FastAPI 應用程式:
docker run -d -p 8000:8000 fastapi-app
-d引數讓容器在背景執行。-p 8000:8000將主機的 8000 連線埠對應到容器的 8000 連線埠,使應用程式可透過http://localhost:8000存取。
內容解密:
docker run命令用於啟動一個新的容器。-d使容器在分離模式下執行,即背景執行。-p 8000:8000設定連線埠對應規則,使外部可以透過主機的 8000 連線埠存取容器內的 FastAPI 服務。
驗證 FastAPI 應用程式是否正常運作
開啟瀏覽器並造訪 http://localhost:8000,檢查 FastAPI 應用是否正確回應。
資料函式倉管理與最佳化策略在現代網頁應用中的重要性
在現代網頁應用的開發中,資料函式倉管理與最佳化策略扮演著至關重要的角色。本章將探討資料函式庫互動的先進技術,涵蓋從傳統的關聯式資料函式庫到當代的NoSQL系統等廣泛的技術和方針。首先,我們將檢視廣泛使用的關聯式資料函式庫MySQL和PostgreSQL,並詳細介紹它們的特性、優點以及推薦的應用場景。
MySQL與PostgreSQL的比較
MySQL是一種開源的關聯式資料函式倉管理系統,以其可靠性和易用性而聞名。它特別受歡迎於網頁應用,並作為LAMP(Linux、Apache、MySQL、PHP/Python/Perl)堆積疊的一部分。MySQL通常被認為對於讀取密集型的應用程式來說是快速且高效的。它預設使用名為InnoDB的儲存引擎,該引擎提供完整的ACID(原子性、一致性、隔離性、耐久性)遵從性,並支援事務,這對於維護資料完整性至關重要。
MySQL的特點
- 預設儲存引擎InnoDB:提供完整的ACID遵從性和事務支援。
- 主從複製:允許資料從一個MySQL資料函式庫伺服器(主伺服器)複製到一個或多個MySQL資料函式庫伺服器(從伺服器),主要用於擴充套件策略、資料備份和冗餘。
- 易用性:MySQL以其簡單性和易用性而聞名,是中小型網頁專案的良好選擇。
PostgreSQL,通常簡稱為Postgres,是一種開源的關聯式資料函式倉管理系統,強調可擴充套件性和SQL遵從性。它在技術和功能上被認為比MySQL更先進。PostgreSQL因其處理複雜查詢和大量並發的能力而受到高度評價。它支援多種效能增強功能,如具有表示式的索引、部分索引和廣泛的索引型別。
PostgreSQL的特點
- 先進的功能:支援複雜查詢和大量並發,具有多種效能增強功能。
- 可擴充套件性:高度可擴充套件,允許定義自訂資料型別、建立自訂函式,甚至可以在不重新編譯資料函式庫的情況下用不同的程式語言編寫程式碼。
- ACID遵從性:高度遵從ACID,支援複雜的SQL事務,並高度關注與SQL標準的相容性。
如何在MySQL和PostgreSQL之間做出選擇
在決定為Python後端應用程式使用MySQL還是PostgreSQL時,需要考慮以下幾個方面:
應用程式需求
- 如果您的應用程式需要完整的ACID遵從性和複雜的事務支援,PostgreSQL可能是更好的選擇。
- 如果您的應用程式是讀取密集型的,並且在事務操作或不需要PostgreSQL提供的先進功能方面不那麼複雜,那麼MySQL可能就足夠了。
可擴充套件性
- 兩個資料函式庫都提供了良好的可擴充套件性選項,但具體選擇可能取決於所需的可擴充套件性型別。對於讀取密集型的應用程式,MySQL的複製能力使其成為一個強壯的選擇。
- PostgreSQL提供了更好的寫入可擴充套件性,更適合具有大量並發事務負載的應用程式。
支援和相容性
- 兩個資料函式庫都有強大的社群和廣泛的檔案。PostgreSQL的社群在開源領域尤其強大,有很多第三方工具和擴充套件可用。
- MySQL由Oracle Corporation所有,提供商業支援,這對於需要保證支援的企業來說是一個決定性的因素。
MongoDB:現代應用程式的靈活資料函式庫解決方案
在當今需要可擴充套件資料函式庫和靈活資料結構的應用程式中,MongoDB 作為一個強大的 NoSQL 資料函式庫,因其高用性、易擴充套件性和高效能而受到青睞。與依賴表格和預定架構的關係型資料函式庫不同,MongoDB 是導向檔案的,這使得資料模型更加多樣和適應性強,因為資料是以 BSON 檔案(二進位制 JSON)的形式儲存,具有動態架構。
瞭解 MongoDB 及其檔案模型
MongoDB 使用檔案模型,這是一種半結構化的資料格式。這種模型非常靈活,允許在不需要預先定義結構的情況下儲存資料。每個檔案都可以有其獨特的結構和不同的欄位,且每個欄位的資料型別在不同檔案中可以不同。
檔案
這些是 MongoDB 中的基本資料單元,類別似於關係型資料函式庫中的列,但更加靈活。MongoDB 中的檔案是一個欄位名稱到值的對映。這些值可以包括陣列和巢狀檔案,提供儲存複雜層次結構的能力。
集合
集合類別似於關係型資料函式庫中的表格,可以容納多個檔案。與關係型資料函式庫中的表格不同,集合不會強制執行架構約束,這意味著集合中的不同檔案可以具有不同的欄位。
為什麼選擇 MongoDB?
- 可擴充套件性:MongoDB 的設計考慮到了可擴充套件性,透過分片支援水平擴充套件,將資料分佈在多台機器上。
- 效能:MongoDB 為讀寫操作提供了高效能。其儲存引擎針對強大的儲存和檢索進行了最佳化,從而提高了整體效能。
- 靈活性:由於其無架構設計,MongoDB 允許在無需預先定義架構或在出現新需求時進行大量修改的情況下開發應用程式。
- 高用性:MongoDB 的複製設施(稱為副本集)提供自動容錯移轉和資料冗餘,保證了應用程式的高用性。
MongoDB 的主要功能
- 查詢功能:MongoDB 支援按欄位搜尋、範圍查詢和正規表示式搜尋。查詢可以傳回檔案中的特定欄位,並包含使用者定義的 JavaScript 函式。
- 索引:MongoDB 檔案中的任何欄位都可以被索引。索引對於提高搜尋效能至關重要。
- 聚合框架:MongoDB 提供根據資料處理管道概念的聚合框架。檔案進入多階段管道,將檔案轉換為聚合結果。
- GridFS:對於儲存和檢索大檔案(如影像、影片或大資料塊),MongoDB 提供了 GridFS,一種儲存和檢索超過 BSON 檔案大小限制(16MB)的檔案的規範。
與 Python 整合 MongoDB
要將 MongoDB 與 Python 一起使用,通常會使用 pymongo 函式庫,它為使用 MongoDB 提供了工具。
安裝
使用 pip 安裝 pymongo。
pip install pymongo
連線到 MongoDB
建立一個連線到 MongoDB 例項的 Python 指令碼。
from pymongo import MongoClient
# 連線到在本地主機埠 27017 上執行的 MongoDB 伺服器
client = MongoClient('localhost', 27017)
# 存取名為 'test_database' 的資料函式庫
db = client.test_database
操作
建立和插入檔案
# 存取名為 'test_collection' 的集合
collection = db.test_collection
# 插入一個檔案
post = {"author": "John", "text": "First post!"}
collection.insert_one(post)
查詢
# 查詢單個檔案
import pprint
pprint.pprint(collection.find_one({"author": "John"}))
更新
# 更新一個檔案
collection.update_one({"author": "John"}, {"$set": {"text": "Updated post"}})
刪除
# 刪除一個檔案
collection.delete_one({"author": "John"})
資料函式庫設計原則
有效的、可擴充套件的和易於維護的資料函式庫的開發在很大程度上依賴於資料函式庫設計原則。如果您的資料函式庫設計良好,則您的應用程式將執行順暢,並能夠承受發生的變化。在決定後端應用程式的最佳資料函式庫架構時,資料型別、預期負載和查詢型別都是重要的考慮因素。
資料函式庫設計的核心原則
正規化
正規化是根據一系列所謂的正規形式構建關係型資料函式庫,以減少資料冗餘並提高資料完整性。正規化涉及將表格分解為冗餘較少的表格,而不會丟失資訊。
- 第一正規化(1NF):確保表格的每個欄位是原子的,並且每個列包含唯一的資料。
- 第二正規化(2NF):要求資料函式庫處於 1NF,並且所有不依賴於主鍵的欄位必須被移除。
- 第三正規化(3NF):如果資料函式庫處於 2NF,並且表格中的所有欄位不僅依賴於主鍵,而且相互獨立,則稱之為 3NF。
實體-關係模型
實體-關係(ER)模型有助於視覺化和設計資料函式庫結構。它涉及定義實體(您想要儲存其資料的事物)以及它們之間的關係。
實際的資料函式庫架構設計
對於後端應用程式,假設您正在開發一個大學管理系統,需要管理學生、課程以及學生在這些課程中的註冊。下面是您可以如何設計資料函式庫架構:
實體
- 學生:包含有關學生的詳細資訊。
- 課程:包含有關課程的資訊。
- 註冊:表示學生和課程之間的關係。
屬性
- 學生:
- Student_ID(主鍵)
- Name
- Date_of_birth
- 課程:
- Course_ID(主鍵)
- Course_Name
- Course_Description
- 註冊:
- Enrollment_ID(主鍵)
- Student_ID(外部索引鍵)
- Course_ID(外部索引鍵)
- Enrollment_Date
這種關係是多對多的,透過註冊表格來表示,該表格包括參照學生和課程表格的外部索引鍵,從而在兩者之間建立連結。
用於建立表格的 SQL 程式碼
CREATE TABLE Students (
Student_ID INT PRIMARY KEY,
Name VARCHAR(100),
Email VARCHAR(100),
Date_of_birth DATE
);
CREATE TABLE Courses (
Course_ID INT PRIMARY KEY,
Course_Name VARCHAR(100),
Course_Description TEXT
);
CREATE TABLE Enrollments (
Enrollment_ID INT PRIMARY KEY,
Student_ID INT,
Course_ID INT,
Enrollment_Date DATE,
FOREIGN KEY (Student_ID) REFERENCES Students(Student_ID),
FOREIGN KEY (Course_ID) REFERENCES Courses(Course_ID)
);
我們的示例大學管理系統的架構旨在有效地管理學生、課程和註冊資料。後端操作可以透過此設計有效地執行,並且可靠性得到提高,因為它減少了冗餘並提高了資料函式庫完整性。
CRUD 操作
現在,我們將深入研究 CRUD 操作的實作。這些操作使您的應用程式能夠有效地管理資料。我們將探討用於對我們建立的架構中的資料執行這些操作的 SQL 方法。
建立記錄(CREATE)
要將新資料新增到我們的表格中,我們使用 SQL INSERT 陳述式。下面是如何向學生、課程和註冊表格新增記錄:
-- 向學生表格插入資料
INSERT INTO Students (Student_ID, Name, Email, Date_of_birth)
VALUES (1, 'John Doe', 'john.doe@gitforgits.com', '2000-01-01');
-- 向課程表格插入資料
INSERT INTO Courses (Course_ID, Course_Name, Course_Description)
VALUES (101, 'Introduction to Psychology', 'A foundational course covering basic principles of psychology.');
-- 向註冊表格插入資料
INSERT INTO Enrollments (Enrollment_ID, Student_ID, Course_ID, Enrollment_Date)
VALUES (1, 1, 101, '2021-09-01');
#### 內容解密:
以上SQL陳述式展示瞭如何向Students、Courses和Enrollments三個表格中插入資料。每條INSERT INTO陳述式都指定了要插入的表格名稱和對應的欄位值。這種方式允許我們根據實際需求向不同的表格中新增新的記錄,並且可以根據具體情況調整插入的值。
#### CRUD 操作的其他部分
除了建立記錄外,CRUD 操作還包括讀取(READ)、更新(UPDATE)和刪除(DELETE)記錄。下面簡要介紹這幾種操作:
- 讀取記錄(READ):使用
SELECT陳述式從表格中檢索資料。例如,從Students表格中檢索所有學生的資訊可以使用以下陳述式:
SELECT * FROM Students;
這條陳述式會傳回 `Students` 表格中的所有列和所有行。
#### #### 內容解密:
這裡使用了 `SELECT` 陳述式來檢索資料。`*` 代表選擇所有欄位,而 `FROM Students` 指定了要從哪個表格中檢索資料。這種查詢方式可以用於取得特定表格中的全部資料,為進一步的資料處理和分析提供了基礎。
* **更新記錄(UPDATE)**:使用 `UPDATE` 陳述式修改現有的記錄。例如,將 `Students` 表格中 `Student_ID` 為1的學生的 `Email` 更新為新的電子郵件地址,可以使用以下陳述式:
```sql
UPDATE Students
SET Email = 'new.email@gitforgits.com'
WHERE Student_ID = 1;
這條陳述式會更新指定學生的電子郵件地址。
#### 內容解密:
在這裡,UPDATE 陳述式用於修改現有的資料。SET 子句指定了要更新的欄位及其新值,而 WHERE 子句則用於指定要更新哪些記錄。這種方式允許精確地定位並修改特定的資料記錄。
- 刪除記錄(DELETE):使用
DELETE陳述式從表格中刪除記錄。例如,從Students表格中刪除Student_ID為1的學生的記錄,可以使用以下陳述式:
DELETE FROM Students WHERE Student_ID = 1;
這條陳述式會刪除指定的學生記錄。
#### #### 內容解密:
這裡使用了 `DELETE FROM` 陳述式來刪除資料。`WHERE` 子句同樣用於指定要刪除哪些記錄。這種方式允許根據特定條件刪除不需要的資料記錄,但需謹慎使用以避免誤刪重要資料。
綜上所述,CRUD 操作為管理和維護資料函式庫中的資料提供了完整的解決方案。透過靈活運用這些操作,可以有效地進行資料的新增、查詢、更新和刪除,從而滿足各種應用場景的需求。