2026年4月1日 星期三

用 Claude 在 PsotgreSQL 的 Docker Container 中建立一個 database

Claude 是一個很強的 AI 工具,大概是我用過唯一可以和 Gemini 挑戰的 AI 工具。

它對於程式設計的能力相當強大。我這個測試證明了,不止程式設計能力很強,連資料庫的整個架構能力也是很嚇人的。

之前,我不是在 Proxmox VE 上建了一個 Zorin OS 的 VM,並且在其上建了一個 PostgreSQL 的Docker Container 嗎?那個 Docker Container 蠻好用的,因為它成功了,所以我有更大的想法想試試看。上次我試了讓 Claude 產生一個用 C++ 23 呼叫 SQLite 的範例,成功,只是按照它產生的 C++ 程式碼,其實只用到 C++23的部份新功能,沒有全部。但是我已經非常滿意了。

這次,我來一個很大很大的挑戰,大到我都不相信我目前的免費版本的 Claude,它會幫我生成嗎?

我向 Claude 提出以下的問題:

我現在想再試另外一種範例。
我想試試你能不能做以下的事。
我在我的 Zorin OS 的 VM 下,會建立一個 PostgreSQL 的 Docker Container。 我建好它了,我稱呼它為 postgres,所以每當我想使用它時,我都會執行:
docker start postgres
接著,如果我想下命令時,只需:
docker exec -it postgres psql -U postgres
就可以用 postgres 帳號,在 psql 的 interactive 模式下,下 SQL 指令。
那麼,我想讓你幫我生一個測試資料庫,它的目的是模擬一家商店的銷貨、庫存、客戶管理系統。它要有這三部份,1. 我希望商品範例能有二十種,隨便產生。2.客戶要有十個範例,一樣,任意產生。3.要有庫存管理的表格。4.要有關性,所以資料表們要正規化。 你能幫我產生這樣的範例資料庫嗎?

回答是:

好的!我來幫你設計一個正規化的商店管理資料庫,包含銷貨、庫存、客戶三大模組。下載這個 .sql 檔後,在你的 VM 裡執行以下步驟即可匯入:

# 把 sql 檔複製進容器
docker cp store_db.sql postgres:/tmp/store_db.sql

# 執行匯入
docker exec -it postgres psql -U postgres -f /tmp/store_db.sql

資料庫結構總覽

資料表共 9 張,依正規化原則設計:

資料表 說明
categories 商品類別(5 種)
suppliers 供應商(5 家)
products 商品(20 種)
inventory 庫存數量(每商品一筆,含安全水位)
inventory_transactions 庫存異動明細(進、出、盤點)
customers 客戶(10 人)
orders 銷貨訂單(10 筆,含各種狀態)
order_items 訂單明細(售價快照,附 generated subtotal)
purchase_orders + purchase_order_items 採購補貨單

關聯圖(簡要)

categories ──< products >── suppliers
                  │
              inventory
              inventory_transactions
                  │
          order_items >── orders >── customers
          purchase_order_items >── purchase_orders >── suppliers 

匯入後,SQL 檔末尾有三段驗證查詢,會自動印出商品列表、訂單摘要、以及庫存低於安全水位的商品,方便你確認資料正確。 



以下是程式碼:


好,我們來看看能不能在我的 Zorin OS 執行?





居然成功了。下圖是 E-R Diagram (點它會出現大圖,小圖看不清楚):


而且,我並沒有要求範例要用中文的,它卻產生中文資料。讓我太驚訝了。

而且架構完整,甚至有幾個亮點:

價格快照 (Price Snapshot):在 order_items 表中,保留了 unit_price 欄位。這是一個非常專業的做法,能確保即便未來商品調價,過去的訂單金額仍能正確回溯。

嚴謹的約束:使用了 CHECK (quantity > 0)GENERATED ALWAYS AS (虛擬欄位),能大幅減少程式碼邏輯出錯導致的資料髒亂。

效能優化:腳本末尾定義了多組 INDEX,針對外鍵欄位建立索引,能顯著提升資料表 Join 時的讀取速度。

由於它成功了,我會在這個基礎下,繼續擴大新的應用範圍,請拭目以待。


2026年3月31日 星期二

測試 Claude 的能耐,讓它產生一個 C++23 的程式看看

 最近很多人在養龍蝦,敝公司也測試性的養個幾隻。由於很多人養龍蝦都是用 Claude AI 這個 AI 引擎,我之前也看過不少文章在推廣用它來協助開發程式。所以,我突然在想,我為何不來測測這東西有什麼能耐?

由於最近我在學習 C++20 和 C++23 這兩個新標準帶來的新功能,其中最令人吃驚的就是 rages 這東西了。它讓 C++ 變成像 shell script 一樣簡單。而且,一看就覺得可以把它拿來做資料庫讀取使用。

所以,我下了以下的咒語

我想試著寫一個可以讀取 SQLite 資料庫的 C++23 程式。
你可以提供一個範例給我嗎?
可以讀取一個6 column X 5 row的 SQLite table,內容隨便產生。
然後用 ranges 和 views 列出內容。
我的 OS 是 Zorin OS,所以是Ubuntu系的,x64版本。IDE 是 Visual Studio Code。OS和IDE我都安裝好了。
請順便告訴我要安裝哪些套件,並且可以讓我馬上可以make好這個範例。

回答:

需要安裝的套件

先在終端機執行以下指令:

main.cpp

Makefile

編譯與執行

2026年1月6日 星期二

建立一個PostgreSQL的Docker image,並使用它

 

測試目標

在Proxmox VE上,安裝一個 Zorin Linux 的 VM,跑 PsogreSQL docker image,試試它的極限。

1, 下載ISO,上傳 Proxmox。

Zorin-OS-18-Core-64-nit.iso

2. 建VM,裝系統。








VM ID:139

自動登入


3. 裝 Chrome


4. 裝Visual Studio Code

可以不裝,這是順便,供下一步測試用。



5. 安裝Docker

安裝方法:

Install Docker Engine on Ubuntu

在加入 docker repository 之後,請把 /etc/apt/sources.lisr.d/docker.sources 最後面加上一行:

Architectures: amd64

這樣就不會每次在下sudo apt update -y時,再出現沒有architecture 'i386'的錯誤訊息。(其實也可以在過程中就加入)

安裝好了之後,如果不想每次都要用sudo才能執行 docker,可以:

sudo usermod -aG docker $USER

newgrp docker

可以用 docker version 試看看。

6. 補充一下,這台的IP是內部私有IP:

7.  建立一個共用的volume

docker volume create postgres-volume

按照Docker的預設,它會在Zorin OS上建立一個 /var/lib/docker/volumes/postgres-volume/_data 的目錄,存放 volume,所以你所建的PostgreSQL的資料庫物件以及資料都會好好地保存在這裡,即使Docker Cintainer結束,Database物件仍會保留下來。

8. 執行一個 postgres 的 container,參數是:POSTGRES_USER=postgres、POSTGRES_PASSWORD=password,以 5432 port 對外,然後使用剛才建立的 volume,採用 17.2 版:

docker run --name postgres \ -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password \ -p 5432:5432 \ -v postgres-volume:/var/lib/postgresql/data \ -d postgres:17.2

9. 看看有沒有執行:

docker container ls -f name=postgres





10. 由於使用 -d 參數,所以回應 (stdio) 完全看不到,但是可以用以下看到 log:

docker logs postgres















11. 關機後能恢復嗎?(Gemini的回覆)

問:如果我之前執行的一個Docker container,由於我的電腦關機,讓它呈現Exit狀態,我能讓它恢復執行嗎?還是把它rm掉,重啟算了?

答:

當然可以恢復!這正是 Docker 容器化技術的優勢之一:容器的狀態和數據是會被保留的,即使電腦關機或容器崩潰,它只是進入了 Exited(退出)狀態,並不會自動消失。

不需要把它 rm 掉,除非你想要放棄之前的配置重新開始。

1. 如何恢復執行的步驟

你可以透過以下簡單指令讓它重新動起來:

  • 第一步:確認容器名稱或 ID

    如果你不記得容器的名字,可以用這行指令列出所有(包含已停止的)容器:

    Bash
    docker ps -a
    

    你會看到狀態顯示為 Exited (...)

  • 第二步:啟動容器

    使用 start 指令(將 keycloak 換成你的容器名稱或 ID):

    Bash
    docker start keycloak
    

    這會讓 Keycloak 在背景啟動,並保留你之前在裡面設定的所有 Realm、User 和 Client。


2. 「啟動 (start)」與「重啟 (rm + run)」的差別

這兩者最大的差別在於資料的持久性

特性docker start (恢復)docker rm + docker run (重啟)
資料保留會保留。你在後台建立的設定都在。會消失。除非你有掛載外部 Volume。
設定變更使用原有的啟動參數,無法更改環境變數。可以重新輸入指令,更改密碼或端口。
適合場景正常維護、電腦重啟、暫時停止。測試壞了想重來、需要更新 Docker 參數。

3. 進階建議:如何讓它「自動復活」?

如果你希望以後電腦重啟或 Docker 服務啟動時,Keycloak 能自動跑起來,你可以在 docker run 時加入 --restart 參數,或者對現有的容器進行修改:

對現有容器增加自動重啟:

Bash
docker update --restart unless-stopped keycloak

這樣以後只要你不是手動下 docker stop,它都會在系統重啟後自動啟動。


疑難排解:如果恢復失敗怎麼辦?

有時候 Keycloak 恢復失敗是因為資料庫連線或某些暫存檔問題,你可以查看日誌找出原因:

Bash
docker logs keycloak

如果發現真的是設定搞爛了,那這時候才是 docker rm 掉,然後用原本的 docker run 指令重啟一個乾淨版本的時機。


用 Claude 在 PsotgreSQL 的 Docker Container 中建立一個 database

Claude 是一個很強的 AI 工具,大概是我用過唯一可以和 Gemini 挑戰的 AI 工具。 它對於程式設計的能力相當強大。我這個測試證明了,不止程式設計能力很強,連資料庫的整個架構能力也是很嚇人的。 之前,我不是在 Proxmox VE 上建了一個 Zorin OS 的 ...