跳轉至

建立 2025-02-12 更新 2026-10-03

PostgreSQL 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 客戶端

docker exec -it my_postgres psql -U postgres

參數說明:

  • exec:在執行中的 container 裡執行指令,這裡執行的是 psql。
  • -it:開啟互動式終端機(interactive + tty)。
  • -U:以使用者 postgres 登入,這是 PostgreSQL 預設的管理者帳號。

3. psql 常用指令

指令 作用
\l 列出所有資料庫
\c mydb 切換到資料庫 mydb
\dt 列出目前資料庫的資料表
\d users 查看資料表 users 的結構
\du 列出使用者(角色)
\q 離開 psql

建立專案用的資料庫與帳號(不要讓應用程式直接使用管理者帳號):

CREATE USER app_user WITH PASSWORD 'app_password';
CREATE DATABASE app_db OWNER app_user;

4. 用 Python 連線 PostgreSQL

Python 最常用的 PostgreSQL 驅動是 psycopg。新專案建議使用第 3 版(套件名稱 psycopg),舊專案常見的 psycopg2 用法幾乎相同。

pip install "psycopg[binary]"
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」一節。

相關資料