後端開發環境好難架,初學資料庫到底需要了解哪些東西?

閱讀時間約 8 分鐘
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
raw-image


資料庫的初衷

管理資料時,我們通常面對幾個基本需求:

資料格式:需要定義資料的結構和格式,通常以表格(table)和欄位(column)的形式呈現。

資料間需要相互參考:資料之間可能需要相互參考,可以通過關聯式或非關聯式的方式實現。

資料操作:對資料進行新增、修改和刪除等操作是必不可少的。

查詢資料:需要能夠根據特定條件查詢資料,以獲取所需的信息。


語意介面: 請資料庫做事 - SQL語法

為了解決基本需求,我們必須有一組跟資料庫的對話方式,而最常見的對話方式就是透過SQL語法

只要對資料庫發送有效的SQL語法,就會得到預期的操作結果,以搜尋名稱為'admin'的使用者為例:

SELECT * FROM users WHERE name = 'admin';

以上語法對於任一SQL資料庫(PostgreSQL、MySQL、Oracle、Microsoft SQL Server... )皆有效。


通訊介面: 與資料庫對話 - TCP/IP

有了對話語法後,下一個問題是雙方能透過什麼方式交換SQL語法,這裡則是使用經典的TCP/IP client-server架構

所有後端教學,一定會有安裝資料庫伺服器程式在自己電腦上的環節。


資料庫伺服器

這個動作其實涉及許多網路服務的概念,也是初學者經常搞不懂的部分。網路服務在程式碼的呈現通常是一組ip:port,例如: 200.100.0.1:80,ip讓使用者能夠連線到主機,而port讓使用者能連線到服務程式

網路上有多個服務主機,透過ip才能指定要連線到哪一台主機
主機可以運行多個服務程式,透過port才能指定要連線到哪一個服務程式

運行在服務主機上的服務程式就是大家熟知的server-side program,通常會透過一個無限while迴圈持續監聽port來接收訊息、回應執行結果。


將資料庫程式設計成TCP/IP client-server架構有許多優勢:

  1. 可擴展性:資料庫容易地擴展以適應不同的地理位置和增加的用戶需求。
  2. 資源共享:多個客戶端可以同時訪問同一伺服器上的數據。
  3. 安全性:有效地實施安全措施,保護數據不被未授權訪問。


了解網路服務的概念後應該不難理解,各種後端教學裡下載安裝資料庫伺服器程式,其實就是讓自己的電腦成為提供資料庫服務的主機

只是資料庫服務的使用者是自己正在開發中的後端程式。

以postgreSQL為例,安裝完成後會跑在127.0.0.1:5432之下。

# mac
lsof -i :5432 -n -P

COMMAND  PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME

postgres 320 postgres    7u  IPv6 0xcae2bc7a36b7ade1      0t0  TCP *:5432 (LISTEN)

postgres 320 postgres    8u  IPv4 0xcae2bc756d253de9      0t0  TCP *:5432 (LISTEN)



資料庫客戶端

當我們安裝好資料庫伺服器後,下一步就是如何管理資料庫、操作數據、檢視數據。這個時候cilent-server架構就發揮了強大的威力,有各式各樣的客戶端程式可以連線到資料庫伺服器。

raw-image


1.命令列工具

通常資料庫伺服器安裝程式都會提供可以在終端機執行的命令列工具,以postgreSQL來說就是psql,底層使用libq函式庫。

raw-image


2.桌面應用

當專案、資料數量增加了之後,命令列會漸漸難以負荷日益沈重的管理、查閱資料的作業需求,這時候我們通常會需要圖形化的桌面應用程式幫忙。

以postgreSQL來說,原廠提供使用python開發的pgAdmin,畫面簡潔易用,底層使用psycopg2函式庫。

raw-image
raw-image


我常用的是開源版本的DBeaver,操作上也是簡潔流暢,除此之外還支援多種資料庫類型,功能非常強大。

raw-image
raw-image


3.後端應用程序

後端應用程序,像Django,是前端(比如網頁界面)和資料庫之間的重要橋樑。這些應用程序封裝了複雜的資料庫操作,無需直接使用SQL語句來與資料庫溝通。

raw-image


這些封裝後的資料庫操作,最後會透過db client傳送給db server,這也是為什麼新建一個Django開發專案時,我們要先下載安裝資料庫客戶端套件:psycopg2, 再將資料庫伺服器設定填寫至設定檔(settings.py) ,才能讓Django順利與資料庫伺服器溝通。

# 安裝資料庫客戶端套件
pip install psycopg2


# Django settings.py​
DATABASES = {
'default': {

'ENGINE': 'django.db.backends.postgresql',

'NAME': 'db-demo',

'USER': 'db-admin',

'PASSWORD': '12345678',

'HOST': 'localhost',

'PORT': '5432',

}
}


深度思考 - 資料庫客戶端的底層實現

像libpq、psycopg2這樣的工具,扮演著應用程序與資料庫伺服器之間的橋樑角色,幫助開發者以簡單的方式執行複雜的資料庫操作,無需深入了解背後發生的具體細節。

Libpq 和 Psycopg2

  • Libpq 是用於連接PostgreSQL資料庫的C語言函式庫,它處理所有底層的網路通信和數據交換。
  • Psycopg2 基於Libpq,是一個Python函式庫,使Python開發者能夠輕鬆與PostgreSQL資料庫互動,執行如查詢和更新數據等操作。
範例1: django使用psycopg2與database server連線
import psycopg2

# 連接到 PostgreSQL 數據庫
conn = psycopg2.connect(
dbname="your_dbname",
user="your_username",
password="your_password",
host="your_host",
port="your_port"
)

# 創建一個 cursor 對象用來執行 SQL 命令
cur = conn.cursor()

# 執行一個查詢
cur.execute("SELECT * FROM your_table")

# 獲取查詢結果
rows = cur.fetchall()

# 輸出查詢結果
for row in rows:
print(row)

# 關閉 cursor 和連接
cur.close()
conn.close()
範例2: psycopg2使用libq與database server連線
#include <libpq-fe.h>

void connect_to_database(const char *conninfo) {
PGconn *conn = PQconnectdb(conninfo);
if (PQstatus(conn) != CONNECTION_OK) {
fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn));
PQfinish(conn);
exit(1);
} else {
fprintf(stdout, "Connection to database succeeded\n");
}
// Always close the connection after done using it
PQfinish(conn);
}


結論

資料庫管理涉及了不同領域的軟體知識,不管是後端或是全端新手,通常在一系列的安裝教學過後已經迷失方向,希望大家可以透過這篇文章稍微了解裝了哪些東西、為何而裝,有方向的慢慢補足相關知識。

  • 網路服務
  • TCP/IP
  • Client-Server架構
  • Linux Shell Script
avatar-img
66會員
19內容數
探索自我實現的小角落。沒有高高在上的教條,只有真實的分享和心得。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
再寫5分鐘 的其他內容
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
你可能也想看
Google News 追蹤
先學習 HTML, CSS, JavaScript 基礎觀念, 再透過實作專案,慢慢熟悉不同的語法使用方式。
Thumbnail
如果你也是從事軟體相關工作的人,一定會遭遇突然需要你去學習一套你不熟悉的程式語言狀況吧,此時你會怎麼做呢? 是趕快去買書來看嗎? 還是趕快找一門程式課來上? 又或者乾脆去找會的同事來教學?
Thumbnail
可能包含敏感內容
先說一下我的背景,非本科系從 2022/3 開始接觸到前端領域,在摸索過程中遇到六角學院,買了 HTML 和 CSS 課程從基礎學起。
Thumbnail
實際就業後,會發現收集與分析需求,通常都不是工程師在做,會有另一群人,以非工程的角度收集及分析需求,然後在開發過程中蹦出不同的火花,於是很好奇另一群人的想法是什麼?我不敢說這本書能完全代表另一群人的想法,但確實能夠得到很多有用的思維。推薦給所有的軟體工程師。
Thumbnail
經過這麼多年的觀察與實踐,一個成熟的軟體工程師還需要第四個要素,它是讓決定你通往熟手的重要關鍵沒有之一。
Thumbnail
隨著科技發展迅速,軟體職缺需求大增長,有些朋友對IT產業有興趣並想成為一位軟體工程師,但不知道從哪裡下手,透過傳統學校、培訓班或自學等不同方法,有多種學習路徑可以選擇。此外,還提供了一些額外資源教學連結,方便讀者進一步提升相關技能。
Thumbnail
系統的分析與規劃 在談到程式設計時,首要的是進行系統的分析與規劃。程式設計的起點通常是系統分析與規劃,這涉及到如何分析和設計系統的大原則和方向。為了達到預期效果,重要的是擁有對產業的清晰邏輯認識和深入了解。 進行深入了解 若要進行系統分析,必須對企業的設計和程式設計的對象進行深入了解,以充分理
Thumbnail
關於程式語言的學習,只要掌握住幾個基本特性要熟悉幾種程式語言也不困難,這三個基本特性就是…
先學習 HTML, CSS, JavaScript 基礎觀念, 再透過實作專案,慢慢熟悉不同的語法使用方式。
Thumbnail
如果你也是從事軟體相關工作的人,一定會遭遇突然需要你去學習一套你不熟悉的程式語言狀況吧,此時你會怎麼做呢? 是趕快去買書來看嗎? 還是趕快找一門程式課來上? 又或者乾脆去找會的同事來教學?
Thumbnail
可能包含敏感內容
先說一下我的背景,非本科系從 2022/3 開始接觸到前端領域,在摸索過程中遇到六角學院,買了 HTML 和 CSS 課程從基礎學起。
Thumbnail
實際就業後,會發現收集與分析需求,通常都不是工程師在做,會有另一群人,以非工程的角度收集及分析需求,然後在開發過程中蹦出不同的火花,於是很好奇另一群人的想法是什麼?我不敢說這本書能完全代表另一群人的想法,但確實能夠得到很多有用的思維。推薦給所有的軟體工程師。
Thumbnail
經過這麼多年的觀察與實踐,一個成熟的軟體工程師還需要第四個要素,它是讓決定你通往熟手的重要關鍵沒有之一。
Thumbnail
隨著科技發展迅速,軟體職缺需求大增長,有些朋友對IT產業有興趣並想成為一位軟體工程師,但不知道從哪裡下手,透過傳統學校、培訓班或自學等不同方法,有多種學習路徑可以選擇。此外,還提供了一些額外資源教學連結,方便讀者進一步提升相關技能。
Thumbnail
系統的分析與規劃 在談到程式設計時,首要的是進行系統的分析與規劃。程式設計的起點通常是系統分析與規劃,這涉及到如何分析和設計系統的大原則和方向。為了達到預期效果,重要的是擁有對產業的清晰邏輯認識和深入了解。 進行深入了解 若要進行系統分析,必須對企業的設計和程式設計的對象進行深入了解,以充分理
Thumbnail
關於程式語言的學習,只要掌握住幾個基本特性要熟悉幾種程式語言也不困難,這三個基本特性就是…