PostgreSQL 使用簡介
PostgreSQL(常簡稱 Postgres)是功能最完整的開源關聯式資料庫,以嚴謹遵循 SQL 標準、穩定可靠著稱,並支援 JSON、全文檢索、地理資料(PostGIS)等進階功能,是新專案最常推薦的伺服器型資料庫。本頁介紹兩種安裝方式(本機安裝與 Docker)、psql 常用指令,以及用 Python 的 psycopg 連線操作。
1. 在本地端安裝 PostgreSQL
請至下方兩個連結在電腦上安裝 PostgreSQL Server 及 pgAdmin:
PostgreSQL 安裝時通常會連帶安裝命令列工具 psql,使用者可以直接從命令列輸入 psql 開始使用,或使用另外安裝的 pgAdmin 圖形介面來管理資料庫。
macOS 使用者
也可以用 Homebrew 安裝:brew install postgresql@17,再以 brew services start postgresql@17 啟動服務;或使用免設定的 Postgres.app。
2. 使用 Docker 執行 PostgreSQL
用 Docker 不會在電腦上留下安裝檔,要換版本或砍掉重練都很方便,是開發環境最推薦的方式。
安裝 Docker Desktop
請至 Docker Desktop 選擇對應的作業系統版本安裝。
啟動 PostgreSQL Server
docker run --name my_postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -v /path/to/your/local/directory:/var/lib/postgresql/data -d postgres
參數說明:
--name:設定 Docker container 名稱。-e:設定環境變數。POSTGRES_PASSWORD是資料庫管理者postgres的密碼。-p:設定埠號映射。冒號前面是 host 的 port,後面是 container 的 port。-v:設定磁碟映射。冒號前面是 host 的路徑,後面是 container 的路徑,讓資料庫的資料存到 host 的目錄,container 刪除後資料仍會保留。-d:在背景執行(detached)。postgres:要執行的映像檔(image),是 PostgreSQL 官方提供的 Docker image。可以用postgres:版本指定版本,譬如postgres:17或postgres:latest。
PostgreSQL 18 以後的資料目錄
官方映像檔自 18 版起,建議把 volume 掛在 /var/lib/postgresql(而非 /var/lib/postgresql/data)。若要使用上方指令,可固定版本為 postgres:17,或依 Docker Hub 說明 調整路徑。
使用 Docker 執行 psql 客戶端
參數說明:
exec:在執行中的 container 裡執行指令,這裡執行的是psql。-it:開啟互動式終端機(interactive + tty)。-U:以使用者postgres登入,這是 PostgreSQL 預設的管理者帳號。
3. psql 常用指令
| 指令 | 作用 |
|---|---|
\l |
列出所有資料庫 |
\c mydb |
切換到資料庫 mydb |
\dt |
列出目前資料庫的資料表 |
\d users |
查看資料表 users 的結構 |
\du |
列出使用者(角色) |
\q |
離開 psql |
建立專案用的資料庫與帳號(不要讓應用程式直接使用管理者帳號):
4. 用 Python 連線 PostgreSQL
Python 最常用的 PostgreSQL 驅動是 psycopg。新專案建議使用第 3 版(套件名稱 psycopg),舊專案常見的 psycopg2 用法幾乎相同。
import psycopg
with psycopg.connect(
host="localhost",
port=5432,
dbname="app_db",
user="app_user",
password="app_password",
) as conn:
with conn.cursor() as cur:
cur.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER
)
""")
cur.execute(
"INSERT INTO users (name, age) VALUES (%s, %s) RETURNING id",
("Alice", 30),
)
print("新增的 id:", cur.fetchone()[0])
cur.execute("SELECT id, name, age FROM users")
for row in cur.fetchall():
print(row)
# 離開 with 區塊時,psycopg 3 會自動 commit(發生例外則 rollback)並關閉連線
重點說明:
- 佔位符是
%s(不是 SQLite 的?),而且不論欄位型別都用%s。 RETURNING id是 PostgreSQL 的語法,可以在新增時直接取回自動產生的主鍵。- 如果使用
psycopg2,with conn:只會 commit 交易、不會關閉連線,需自行呼叫conn.close()。
推薦影音
PostgreSQL in 100 Seconds(Fireship)
簡述:100 秒介紹 PostgreSQL 的定位與特色(物件關聯式、擴充套件、JSON 支援),適合在安裝前先建立整體印象。
Learn PostgreSQL Tutorial - Full Course for Beginners(freeCodeCamp)
簡述:由 Amigoscode 製作、約 4 小時的完整課程,涵蓋安裝、psql、建表、查詢、JOIN、主鍵外鍵、匯出匯入等,是 PostgreSQL 入門最完整的免費影片之一。
Step-by-Step Python and Postgres Tutorial with psycopg2(Hussein Nasser)
簡述:示範用 Python 與 psycopg2 連線 PostgreSQL、讀寫資料的完整步驟,對應本頁「用 Python 連線 PostgreSQL」一節。