PostgreSQL 開發者工具鏈:psql、pgAdmin、pgbench、pgTAP 完整指南 | PostgreSQL

2026/07/25
PostgreSQL 開發者工具鏈:psql、pgAdmin、pgbench、pgTAP 完整指南 | PostgreSQL

PostgreSQL 擁有豐富且成熟的開發工具生態——從官方 CLI 工具 psql、圖形化管理介面 pgAdmin 4,到效能測試框架 pgbench 與單元測試工具 pgTAP,開發者與 DBA 可以根據不同場景選擇最適合的工具組合。本文將深入每個工具的進階用法,幫助你打造高效的 PostgreSQL 工作流程。

開發工具的四個層次

PostgreSQL 的開發工具可依功能分為四個層次:

┌─────────────────────────────────────────────────────────────┐
│ Layer 4:分析與調優          pg_stat_statements 查詢分析      │
│                             auto_explain, EXPLAIN           │
├─────────────────────────────────────────────────────────────┤
│ Layer 3:測試與驗證          pgTAP(單元測試)                │
│                             pgbench(效能測試)              │
├─────────────────────────────────────────────────────────────┤
│ Layer 2:資料搬遷            pg_dump / pg_restore            │
│                             COPY(高速匯入匯出)             │
├─────────────────────────────────────────────────────────────┤
│ Layer 1:互動操作            psql(CLI)                     │
│                             pgAdmin / DBeaver / DataGrip     │
└─────────────────────────────────────────────────────────────┘

CLI vs GUI 的選擇

面向CLI(psql / pgcli)GUI(pgAdmin / DBeaver / DataGrip)
自動化腳本優秀,可嵌入 Shell/CI不適合
遠端伺服器SSH 即可使用需 SSH Tunnel
複雜查詢開發適合短查詢語法高亮、自動補全、結果視覺化
Schema 瀏覽\d 系列 meta command樹狀結構、ER 圖
效能分析EXPLAIN 文字輸出圖形化執行計劃
學習曲線較陡峭較友善

生產環境中,psql 是 DBA 的首選——輕量、可腳本化、無需安裝圖形環境。開發環境中,GUI 工具能大幅提升探索性查詢效率。


psql 進階用法

psql 是 PostgreSQL 官方 CLI 客戶端,功能遠比表面看到的強大。

Meta Commands 精選

-- Schema 探索
\dt+                    -- 列出所有 tables(含大小)
\d+ orders              -- 顯示 table 結構(含儲存參數)
\di+ orders*            -- 列出特定 table 的 indexes
\df+ public.*           -- 列出所有 functions
\dx                     -- 列出所有 extensions
\sf my_function         -- 顯示 function 原始碼
\sv my_view             -- 顯示 view 定義
\sf+ my_function        -- 含行號的原始碼

-- 連線與資訊
\conninfo               -- 顯示連線資訊
\c otherdb              -- 切換資料庫
\l+                     -- 列出所有 databases
\dn+                    -- 列出所有 schemas
\du+                    -- 列出所有 roles

-- 輸出控制
\x auto                 -- 自動切換擴展顯示(推薦)
\timing on              -- 顯示查詢執行時間
\pset null '(NULL)'     -- NULL 值明確顯示
\pset format csv        -- CSV 格式輸出

\watch — 即時監控

\watch 是 psql 的即時監控利器,每隔指定秒數自動重新執行最後一個查詢:

-- 每 2 秒監控活動連線
SELECT pid, usename, state, wait_event_type, left(query, 60) AS query
FROM pg_stat_activity
WHERE state = 'active' AND pid <> pg_backend_pid();
\watch 2

-- 每 5 秒監控複寫延遲
SELECT
    client_addr, state,
    pg_wal_lsn_diff(sent_lsn, replay_lsn) AS replay_lag_bytes,
    replay_lag
FROM pg_stat_replication;
\watch 5

-- 每 10 秒監控表膨脹
SELECT
    relname, n_live_tup, n_dead_tup,
    round(100.0 * n_dead_tup / nullif(n_live_tup + n_dead_tup, 0), 1) AS dead_pct,
    last_autovacuum::timestamp(0)
FROM pg_stat_user_tables
WHERE n_live_tup > 1000
ORDER BY dead_pct DESC NULLS LAST LIMIT 10;
\watch 10

-- PG16+:指定次數與間隔
\watch i=2 c=10   -- 每 2 秒一次,共 10 次

\copy — 客戶端 COPY

與伺服器端 COPY 不同,\copy 透過 psql 連線傳輸,不需要伺服器端檔案存取權限:

-- 匯出查詢結果為 CSV
\copy (SELECT * FROM orders WHERE created_at > '2026-01-01') TO '/tmp/orders.csv' WITH (FORMAT csv, HEADER true)

-- 從 CSV 匯入
\copy staging_orders FROM '/home/user/data.csv' WITH (FORMAT csv, HEADER true, NULL '')
特性\copy(psql 指令)COPY(SQL 指令)
檔案位置客戶端本地伺服器端
權限需求一般使用者需 superuser
效能透過網路,略慢伺服器直接讀寫,較快
適用場景開發環境、遠端操作大量資料搬移

psql 獨有進階功能

-- \gexec:將查詢結果作為 SQL 執行(Meta Programming)
SELECT format('CREATE INDEX idx_%I_id ON %I(id);', tablename, tablename)
FROM pg_tables
WHERE schemaname = 'public' AND tablename NOT IN (
    SELECT tablename FROM pg_indexes WHERE indexname LIKE '%_id'
);
\gexec
-- 自動為所有缺少 id 索引的表建立索引

-- \crosstabview:交叉表視圖(樞紐分析)
SELECT
    extract(month FROM created_at)::int AS month,
    status,
    count(*)
FROM orders
WHERE created_at >= '2026-01-01'
GROUP BY 1, 2 ORDER BY 1, 2;
\crosstabview

-- \gdesc:顯示查詢欄位型別(不實際執行)
SELECT id, name, total_amount FROM orders;
\gdesc

psqlrc 自訂配置

-- ~/.psqlrc 範例

-- 客製化 PROMPT(顯示 DB 名稱與主機)
\set PROMPT1 '%[%033[1;31m%]%/%[%033[0m%] %n@%M:%> %x%R%# '

-- NULL 顯示為明確文字
\pset null '¤NULL¤'

-- 自動切換擴展顯示
\x auto

-- 顯示查詢執行時間
\timing on

-- 歷史紀錄設定
\set HISTSIZE 5000
\set HISTFILE ~/.psql_history-:DBNAME
\set HISTCONTROL ignoredups

-- 錯誤時自動 rollback 到 savepoint
\set ON_ERROR_ROLLBACK interactive

-- 常用查詢別名
\set activity 'SELECT pid, usename, state, wait_event_type, left(query, 80) AS query FROM pg_stat_activity WHERE state != \'idle\' AND pid <> pg_backend_pid() ORDER BY query_start;'
\set locks 'SELECT pid, locktype, relation::regclass, mode, granted FROM pg_locks WHERE NOT granted ORDER BY pid;'
\set bloat 'SELECT relname, n_live_tup, n_dead_tup, round(100.0 * n_dead_tup / nullif(n_live_tup + n_dead_tup, 0), 1) AS dead_pct FROM pg_stat_user_tables WHERE n_live_tup > 1000 ORDER BY dead_pct DESC NULLS LAST LIMIT 20;'
\set dbsize 'SELECT datname, pg_size_pretty(pg_database_size(datname)) AS size FROM pg_database ORDER BY pg_database_size(datname) DESC;'
\set tablesize 'SELECT relname, pg_size_pretty(pg_total_relation_size(oid)) AS total_size, pg_size_pretty(pg_relation_size(oid)) AS table_size, pg_size_pretty(pg_indexes_size(oid)) AS index_size FROM pg_class WHERE relkind = \'r\' AND relnamespace = \'public\'::regnamespace ORDER BY pg_total_relation_size(oid) DESC LIMIT 20;'

\echo '=== psqlrc loaded ==='
\echo 'Type :activity :locks :bloat :dbsize :tablesize for quick queries'

使用方式——在 psql 中輸入 :activity:locks 等即可執行預定義查詢。


GUI 管理工具比較

pgAdmin 4

pgAdmin 4 是 PostgreSQL 官方推薦的開源圖形化管理工具,以 Web 應用形式運行:

# macOS
brew install --cask pgadmin4

# Docker(推薦開發環境)
docker run -d --name pgadmin4 \
  -p 5050:80 \
  -e PGADMIN_DEFAULT_EMAIL=admin@example.com \
  -e PGADMIN_DEFAULT_PASSWORD=admin \
  dpage/pgadmin4

核心功能:伺服器管理(多實例樹狀瀏覽)、查詢工具(語法高亮+自動補全)、EXPLAIN 圖形化(瓶頸節點紅色高亮)、Dashboard 即時監控、GUI 化的 pg_dump/pg_restore。

DBeaver

開源的通用資料庫管理工具,支援 PostgreSQL、MySQL、Oracle 等數十種資料庫:

# macOS
brew install --cask dbeaver-community

# Linux
flatpak install flathub io.dbeaver.DBeaverCommunity

PostgreSQL 特有功能:ER 圖自動生成、資料匯入/匯出精靈(CSV/JSON/XML/Excel)、Extension 管理介面、多格式匯出。

DataGrip

JetBrains 出品的商用資料庫 IDE,擁有最強大的 SQL 智慧補全:

核心優勢:理解 Schema 上下文的精確補全、SQL 重構(重命名自動更新引用)、版本控制整合、資料比較(跨 database/schema)、PL/pgSQL 智慧感知。

pgcli — 智慧補全 CLI

psql 的增強替代品,最大特色是即時的多行自動補全與語法高亮:

pip install pgcli
pgcli -h localhost -U postgres -d mydb
功能psqlpgcli
自動補全基礎(Tab)即時多行(Fuzzy matching)
語法高亮有(即時)
\watch支援不支援
\copy支援不支援
適用場景生產環境、腳本自動化開發環境、互動式探索

pg_dump / pg_restore 進階技巧

pg_dump 進階用法

# 並行 dump(僅支援 -Fd 目錄格式,-j 建議 CPU 核心數的 50-75%)
pg_dump -U postgres -Fd mydb -j 8 -f /backup/mydb_dir/

# 排除大表資料但保留結構(開發環境複製)
pg_dump -U postgres -Fc mydb \
  --exclude-table-data='audit_*' \
  --exclude-table-data='log_*' \
  --exclude-table-data='sessions' \
  > mydb_dev.dump

# 只備份特定 tables
pg_dump -U postgres -Fc mydb \
  -t 'orders' -t 'order_items' -t 'customers' \
  > mydb_core.dump

# 分離結構和資料(便於先建表再匯入)
pg_dump -U postgres --section=pre-data  -Fc mydb > mydb_pre.dump
pg_dump -U postgres --section=data      -Fc mydb > mydb_data.dump
pg_dump -U postgres --section=post-data -Fc mydb > mydb_post.dump

# 可攜式 dump(忽略 owner、privilege、tablespace)
pg_dump -U postgres -Fc mydb \
  --no-owner --no-privileges --no-tablespaces \
  > mydb_portable.dump

# PG16+:指定壓縮算法
pg_dump -U postgres -Fc --compress=lz4 mydb > mydb_lz4.dump
pg_dump -U postgres -Fc --compress=zstd:3 mydb > mydb_zstd.dump

pg_restore 進階用法

# 並行還原(大幅縮短時間)
pg_restore -U postgres -d mydb -j 8 mydb.dump

# 選擇性還原:列出內容 → 編輯 → 還原
pg_restore --list mydb.dump > restore_list.txt
# 編輯 restore_list.txt,用 ; 註解不需要的項目
pg_restore -U postgres -d mydb -L restore_list.txt mydb.dump

# 分段還原(效能最佳化:先建表 → 匯入資料 → 再建索引)
pg_restore -U postgres -d mydb --section=pre-data mydb_pre.dump
pg_restore -U postgres -d mydb --section=data mydb_data.dump
pg_restore -U postgres -d mydb --section=post-data mydb_post.dump

分段還原的效能優勢:將 post-data(indexes、constraints、triggers)分離到資料匯入之後建立,可避免匯入每筆資料時都更新索引,整體速度可提升數倍。


COPY 高速匯入匯出

COPY 是 PostgreSQL 伺服器端的高速資料搬遷指令,速度遠超 INSERT——在 SSD 伺服器上,每秒可匯入約 50 萬~200 萬行

基本用法

-- 匯出查詢結果
COPY (
    SELECT o.id, c.name, o.total_amount
    FROM orders o JOIN customers c ON o.customer_id = c.id
    WHERE o.created_at >= '2026-01-01'
) TO '/tmp/order_summary.csv' WITH (FORMAT csv, HEADER true);

-- 匯入到臨時表(常見 ETL 模式)
CREATE TEMP TABLE staging_orders (LIKE orders INCLUDING ALL);
COPY staging_orders FROM '/tmp/new_orders.csv' WITH (FORMAT csv, HEADER true);

-- 合併到正式表(UPSERT)
INSERT INTO orders SELECT * FROM staging_orders
ON CONFLICT (id) DO UPDATE SET
    total_amount = EXCLUDED.total_amount,
    updated_at = now();

進階參數

-- PG17+:ON_ERROR 參數(跳過格式錯誤的行)
COPY orders FROM '/tmp/messy_data.csv' WITH (
    FORMAT csv, HEADER true,
    ON_ERROR 'ignore'       -- 跳過錯誤行而非中止
);

-- COPY FREEZE:匯入同時凍結 tuple,避免後續 VACUUM
BEGIN;
TRUNCATE orders;
COPY orders FROM '/data/orders.csv' WITH (FORMAT csv, HEADER true, FREEZE true);
COMMIT;

大量匯入效能最佳化

-- 1. 暫時停用 indexes
-- 2. 暫時停用 triggers
ALTER TABLE orders DISABLE TRIGGER ALL;
-- 3. 暫時停用 foreign key checks
SET session_replication_role = replica;
-- 4. 增大 maintenance_work_mem
SET maintenance_work_mem = '1GB';
-- 5. 執行 COPY
COPY orders FROM '/data/large_import.csv' WITH (FORMAT csv, HEADER true);
-- 6. 重建 indexes
-- 7. 恢復 triggers
ALTER TABLE orders ENABLE TRIGGER ALL;
SET session_replication_role = DEFAULT;
-- 8. 更新統計
ANALYZE orders;

管道串聯用法

# 從壓縮檔直接匯入
gunzip -c orders.csv.gz | psql -U postgres -d mydb \
  -c "COPY orders FROM STDIN WITH (FORMAT csv, HEADER true)"

# 跨伺服器資料搬遷
psql -h source -c "COPY orders TO STDOUT WITH (FORMAT csv, HEADER true)" | \
psql -h target -c "COPY orders FROM STDIN WITH (FORMAT csv, HEADER true)"

# 搭配 pv 監控傳輸進度
psql -h source -c "COPY orders TO STDOUT WITH (FORMAT binary)" | \
  pv -pterb | \
  psql -h target -c "COPY orders FROM STDIN WITH (FORMAT binary)"

pgTAP — 資料庫單元測試

pgTAP 是 PostgreSQL 的單元測試框架 Extension,實作 TAP(Test Anything Protocol),讓你以 SQL 撰寫資料庫層級的測試。

安裝

# Ubuntu/Debian
sudo apt install postgresql-17-pgtap

# macOS
brew install pgtap
CREATE EXTENSION pgtap;

測試撰寫

BEGIN;
SELECT plan(5);    -- 宣告共 5 個測試

-- 結構測試
SELECT has_table('orders', 'orders 表應存在');
SELECT has_column('orders', 'total_amount', '應有 total_amount 欄位');
SELECT col_type_is('orders', 'total_amount', 'numeric', '型別應為 numeric');
SELECT has_pk('orders', '應有 primary key');
SELECT has_fk('order_items', '應有 foreign key');

SELECT * FROM finish();
ROLLBACK;    -- rollback 確保測試不污染資料

常用測試函式

-- 欄位約束測試
SELECT col_not_null('orders', 'customer_id', 'customer_id 不可為 NULL');
SELECT col_has_default('orders', 'created_at', 'created_at 應有預設值');
SELECT col_default_is('orders', 'status', 'pending', 'status 預設為 pending');

-- 外鍵測試
SELECT fk_ok('order_items', 'order_id', 'orders', 'id',
             'order_items.order_id 應參照 orders.id');

-- 索引測試
SELECT has_index('orders', 'idx_orders_customer_id', '索引應存在');
SELECT index_is_type('orders', 'idx_orders_customer_id', 'btree', '應為 btree');

-- Function 測試
SELECT has_function('calculate_total', ARRAY['integer'], '函數應存在');
SELECT function_returns('calculate_total', ARRAY['integer'], 'numeric', '應回傳 numeric');

-- 資料測試(結果集比較)
SELECT results_eq(
    'SELECT count(*)::integer FROM orders WHERE status = ''completed''',
    ARRAY[42],
    '已完成訂單應有 42 筆'
);

-- 例外測試
SELECT throws_ok(
    'INSERT INTO orders (id) VALUES (NULL)',
    '23502',
    NULL,
    '插入 NULL id 應報錯'
);

Schema Migration 測試

BEGIN;
SELECT plan(8);

SELECT has_table('user_preferences', 'migration 應建立 user_preferences 表');
SELECT has_column('user_preferences', 'user_id', '應有 user_id 欄位');
SELECT has_column('user_preferences', 'theme', '應有 theme 欄位');
SELECT col_type_is('user_preferences', 'theme', 'text', '應為 text');
SELECT col_default_is('user_preferences', 'theme', 'light', '預設為 light');
SELECT fk_ok('user_preferences', 'user_id', 'users', 'id');
SELECT has_index('user_preferences', 'idx_user_preferences_user_id');
SELECT hasnt_column('users', 'preferences_json', '舊欄位應已移除');

SELECT * FROM finish();
ROLLBACK;

使用 pg_prove 執行

# 執行測試目錄下所有 .sql 測試檔
pg_prove -U postgres -d testdb tests/*.sql

# 詳細輸出
pg_prove -U postgres -d testdb -v tests/*.sql
# CI/CD 整合(GitHub Actions)
- name: Run database tests
  run: pg_prove -U postgres -d testdb --recurse tests/

pgbench — 效能測試

pgbench 是 PostgreSQL 內建的基準測試工具,用於衡量資料庫在特定負載下的 TPS(Transactions Per Second)。

初始化與基本測試

# 初始化測試資料(-s 100 → 約 1.6GB,1000 萬筆帳戶)
pgbench -U postgres -i -s 100 mydb

# 基礎壓測:10 個客戶端,每個 100 transactions
pgbench -U postgres -c 10 -t 100 mydb

# 指定持續時間 + 多執行緒 + 進度報告
pgbench -U postgres -c 32 -j 8 -T 120 -P 5 mydb

# 只讀測試
pgbench -U postgres -c 32 -j 8 -T 60 -S mydb

# 使用 Prepared Statements(更貼近實際)
pgbench -U postgres -c 16 -j 4 -T 120 -M prepared mydb

自訂測試腳本

# 建立自訂腳本
cat > /tmp/custom_bench.sql << 'EOF'
\set customer_id random(1, 100000)
\set amount random(100, 10000)
BEGIN;
SELECT * FROM customers WHERE id = :customer_id;
INSERT INTO orders (customer_id, total_amount, status)
VALUES (:customer_id, :amount, 'pending');
UPDATE customers SET last_order_at = now() WHERE id = :customer_id;
COMMIT;
EOF

pgbench -U postgres -c 16 -j 4 -T 120 -f /tmp/custom_bench.sql mydb

# 多腳本混合測試(讀寫比 80:20)
pgbench -U postgres -c 16 -j 4 -T 120 \
  -f /tmp/read_bench.sql@80 \
  -f /tmp/custom_bench.sql@20 \
  mydb

模擬熱點資料

# Zipfian 分佈(少數 ID 被頻繁存取,貼近真實場景)
cat > /tmp/zipf_bench.sql << 'EOF'
\set aid random_zipfian(1, 100000, 1.5)
SELECT * FROM pgbench_accounts WHERE aid = :aid;
EOF

pgbench -U postgres -c 16 -T 120 -f /tmp/zipf_bench.sql mydb

結果解讀

指標意義健康值
TPS每秒處理的 transaction 數取決於硬體與負載模型
latency average平均回應延遲OLTP 通常 <5ms
latency stddev延遲標準差越低越穩定
failed transactions失敗率應為 0%

pg_stat_statements 查詢分析工作流

pg_stat_statements 是查詢效能分析的基石。以下是系統化的分析工作流:

Step 1:重置統計 → 定義觀察視窗
Step 2:收集數據 → 等待業務高峰期
Step 3:Top-N 分析 → 找出最耗資源的查詢
Step 4:深入診斷 → EXPLAIN ANALYZE
Step 5:優化執行 → 新增索引 / 改寫查詢
Step 6:驗證效果 → 比對前後統計

Top-N 多維分析

-- 維度一:總耗時 Top 20(對整體效能影響最大)
SELECT
    queryid,
    round(total_exec_time::numeric / 1000, 2) AS total_secs,
    calls,
    round(mean_exec_time::numeric, 2) AS avg_ms,
    rows,
    round(100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0), 1) AS hit_pct,
    left(query, 120) AS query
FROM pg_stat_statements
ORDER BY total_exec_time DESC LIMIT 20;

-- 維度二:平均耗時 Top 20(單次最慢)
SELECT queryid, calls,
    round(mean_exec_time::numeric, 2) AS avg_ms,
    round(max_exec_time::numeric, 2) AS max_ms,
    left(query, 120) AS query
FROM pg_stat_statements
WHERE calls >= 10
ORDER BY mean_exec_time DESC LIMIT 20;

-- 維度三:I/O 密集 Top 20(需要索引優化)
SELECT queryid, calls,
    shared_blks_read AS disk_reads,
    round(100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0), 1) AS hit_pct,
    left(query, 120) AS query
FROM pg_stat_statements
ORDER BY shared_blks_read DESC LIMIT 20;

-- 維度四:執行時間不穩定(CV 值高)
SELECT queryid, calls,
    round(mean_exec_time::numeric, 2) AS avg_ms,
    round(100.0 * stddev_exec_time / nullif(mean_exec_time, 0), 1) AS cv_pct,
    left(query, 120) AS query
FROM pg_stat_statements
WHERE calls >= 50 AND mean_exec_time > 10
ORDER BY cv_pct DESC LIMIT 20;

工具選型建議

場景推薦工具備選
個人開發者pgcli + DBeaverpsql + pgAdmin
小型團隊DataGrip + psqlDBeaver + pgcli
大型團隊DataGrip + pgAdminDBeaver Enterprise
DBA 日常維運psql + psqlrcpgAdmin Dashboard
CI/CD 管線psql + pgTAPpg_prove
效能測試pgbenchpgbench + custom script
效能分析pg_stat_statements+ auto_explain + pgBadger
資料搬遷(小量)pg_dump / pg_restoreDBeaver 匯出匯入
資料搬遷(大量)COPY + 管道pg_dump -Fd -j

工具鏈整合流程

成熟的 PostgreSQL 開發流程會將多個工具串聯:

開發階段:
  pgcli/DataGrip → 撰寫與測試 SQL
       │
       ▼
  pgTAP ─────→ 資料庫單元測試
       │
       ▼
  EXPLAIN ANALYZE → 驗證查詢效能

部署階段:
  pg_dump ────→ 備份現有結構/資料
       │
       ▼
  migration tool → 執行 Schema 變更
       │
       ▼
  pgbench ────→ 壓力測試新版本效能

營運階段:
  pg_stat_statements → 持續追蹤查詢效能
       │
       ▼
  auto_explain ────→ 自動記錄慢查詢執行計劃
       │
       ▼
  pgBadger / Grafana → 報告與告警

版本演進

PostgreSQL 版本開發工具相關新功能
PG10pgbench 支援 \if/\elif/\else 條件邏輯
PG11pgbench 支援 random_zipfian() 分佈函式
PG13pg_stat_statements 新增 WAL 統計
PG15psql \dconfig 模糊搜尋;pg_dump 支援 LZ4/zstd 壓縮
PG16\watch 支援 i=/c= 參數;pg_dump 壓縮算法選擇
PG17COPY 新增 ON_ERRORLOG_VERBOSITY 參數

總結

PostgreSQL 的開發工具生態涵蓋了從日常開發到生產維運的完整鏈路。psql 是不可替代的基礎——掌握 \watch\gexec\copy、psqlrc 自訂別名等進階功能,可以大幅提升 DBA 效率。pgTAP 讓資料庫測試像應用程式測試一樣標準化。pgbench 在上線前提供客觀的效能基準。pg_stat_statements 則是生產環境中持續追蹤查詢效能的基石。

選擇工具不必二選一——CLI 與 GUI、psql 與 pgcli、pgAdmin 與 DataGrip 各有長處,根據場景靈活搭配,才是最高效的工作方式。

下一篇(也是本系列最終篇),我們將探討 Citus 分散式 PostgreSQL——如何將 PostgreSQL 水平擴展到多節點叢集,處理 TB 級甚至 PB 級的大規模資料。

BenZ Software Developer

熱愛技術的軟體開發者,在這裡分享程式開發經驗與學習筆記。

本週主打

AI 自動化入門包

你每天手動在做的那些煩事,其實 AI 可以自己跑。這份給你 10 個照著做就會的自動化工作流 + 50 個複製即用的提示詞,不用會寫程式。

看看這個產品 →