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

閱讀時間約 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
66會員
19Content count
探索自我實現的小角落。沒有高高在上的教條,只有真實的分享和心得。
留言0
查看全部
發表第一個留言支持創作者!
再寫5分鐘 的其他內容
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
奇怪,名字呢? 在上一章中,我們成功的將"result.txt"檔案讀進來,並且取得了前三名的分數,但是仔細想想,這個程式卻沒有輸出前三名相對應的人名,這樣要怎麼頒獎給獲勝的人呢? 功能需求變更:請將程式修改成可以一同輸出前三名的名字與其分數 分析:按照目前所學,我們可以再多創建一個陣列用來存
Thumbnail
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
函式 隨著程式功能越來越多,所撰寫的程式碼也會越來越龐大,此時要管理複雜的程式並不是很容易的事,此時可以利用函式來控制程式的複雜度。 提醒 本章節中原本有將訊息傳送給 Twitter 平台的範例,我將其修正為使用print()顯示訊息來模擬(為了不將時間花費在申請 Twitter 帳號)。
Thumbnail
字串處理 每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。 字串就是一連串的字元。 字串的第一個字為起始位置(Start),從 0 開始。 字串其他位置的字元與起始字元的距離則
Thumbnail
為什麼要學習撰寫程式? 使用別人所撰寫的軟體時,總是會受限於別人所提供的特定功能,但是當你遇到了一些工作是目前現有的軟體都幫不上忙的情況該怎麼辦? 如果你會撰寫程式,這時候就可以自己創造一個專為解決此工作的程式;換句話說,撰寫程式讓你擁有控制電腦的力量。 安裝 Python 首先必須在電腦
Thumbnail
簡介: 這是一個關於程式設計的系列文章,或者準確的說是一系列的學習筆記,紀錄著我學習程式設計的筆記與心得。我決定從這本《深入淺出-程式設計》開始紀錄,原因是因為這本書在有限的篇幅中,僅可能的對於什麼是程式設計進行了生動的說明,內容著重於程式邏輯與現實編程中的所會遇到的實際問題,循序漸進且實際演練,
Thumbnail
本篇說明為何歐洲有如此多的圓環,以及圓環對於交通安全與效率的意義與設計概念
Thumbnail
最近看了這本書,身為在健身房待過一段時間、又有一點點醫學常識的人,真心覺得這本書寫得很中肯,又一針見血地指出許多人在瘦身上的盲點。
Thumbnail
8月6日,No. 218,深入淺出 1. 不知道是不是所謂大道至簡,其實深入淺出本身就是功夫。 2. 傳遞知識不只是要讓聽眾覺得講師很厲害,還得讓聽眾覺得自己變得厲害了。 3. 有出一系列影片,每集用五個層次,從小孩到專家,介紹一個概念。一直覺得這系列蠻有趣的,可惜只有13集。
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
奇怪,名字呢? 在上一章中,我們成功的將"result.txt"檔案讀進來,並且取得了前三名的分數,但是仔細想想,這個程式卻沒有輸出前三名相對應的人名,這樣要怎麼頒獎給獲勝的人呢? 功能需求變更:請將程式修改成可以一同輸出前三名的名字與其分數 分析:按照目前所學,我們可以再多創建一個陣列用來存
Thumbnail
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
函式 隨著程式功能越來越多,所撰寫的程式碼也會越來越龐大,此時要管理複雜的程式並不是很容易的事,此時可以利用函式來控制程式的複雜度。 提醒 本章節中原本有將訊息傳送給 Twitter 平台的範例,我將其修正為使用print()顯示訊息來模擬(為了不將時間花費在申請 Twitter 帳號)。
Thumbnail
字串處理 每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。 字串就是一連串的字元。 字串的第一個字為起始位置(Start),從 0 開始。 字串其他位置的字元與起始字元的距離則
Thumbnail
為什麼要學習撰寫程式? 使用別人所撰寫的軟體時,總是會受限於別人所提供的特定功能,但是當你遇到了一些工作是目前現有的軟體都幫不上忙的情況該怎麼辦? 如果你會撰寫程式,這時候就可以自己創造一個專為解決此工作的程式;換句話說,撰寫程式讓你擁有控制電腦的力量。 安裝 Python 首先必須在電腦
Thumbnail
簡介: 這是一個關於程式設計的系列文章,或者準確的說是一系列的學習筆記,紀錄著我學習程式設計的筆記與心得。我決定從這本《深入淺出-程式設計》開始紀錄,原因是因為這本書在有限的篇幅中,僅可能的對於什麼是程式設計進行了生動的說明,內容著重於程式邏輯與現實編程中的所會遇到的實際問題,循序漸進且實際演練,
Thumbnail
本篇說明為何歐洲有如此多的圓環,以及圓環對於交通安全與效率的意義與設計概念
Thumbnail
最近看了這本書,身為在健身房待過一段時間、又有一點點醫學常識的人,真心覺得這本書寫得很中肯,又一針見血地指出許多人在瘦身上的盲點。
Thumbnail
8月6日,No. 218,深入淺出 1. 不知道是不是所謂大道至簡,其實深入淺出本身就是功夫。 2. 傳遞知識不只是要讓聽眾覺得講師很厲害,還得讓聽眾覺得自己變得厲害了。 3. 有出一系列影片,每集用五個層次,從小孩到專家,介紹一個概念。一直覺得這系列蠻有趣的,可惜只有13集。