iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0

建立好 Schema 之後,下一步就是寫 seed.sql 灌入測試資料。有了假資料,後續開發 PHP 畫面與測試 API 時才不用每次都手動一筆一筆新增。

什麼是 seed.sql?為什麼要生成它?

如果說 schema.sql 是建築物的「空屋藍圖」,那麼 seed.sql 就是在房子蓋好後先搬進去測試的「樣品家具」。

在開發流程中,建立 Seed 資料有四大核心用意:

  1. 提供開發時的可視化資料:若資料庫為空,寫 PHP 畫面時將無法確認書籍列表、表格排版與欄位顯示是否正常。

  2. 驗證外鍵與約束機制:同時灌入 members、books 與關聯兩者的 loans 紀錄,測試具名外鍵 Constraint 是否正常運作。

  3. 快速重置開發環境(一鍵還原):開發「借還書」或「刪除會員」時資料容易被改亂,有了腳本隨時都能一秒還原至初始測試狀態。

  4. 提升與 AI (Claude Code) 協作效率:讓 AI 掌握範例資料結構(如 admin 與 member 角色分類),寫出來的程式碼會更精準。

補充說明:
測試資料不會混進正式環境。seed.sql 只是開發期間的「輔助道具」。系統正式上線時,只會執行 schema.sql 建好空白表格,再由使用者註冊或透過腳本批量匯入書籍資料。

步驟一:使用 Claude Code 生成測試資料填充腳本 seed.sql

在 WSL2 專案目錄下啟動 Claude Code,下達以下 Prompt 產生測試資料:

請幫我在 sql/seed.sql 撰寫測試資料灌入腳本:
1. 先 USE library_system;
2. books 表:新增至少 5 本不同類別的書籍,注意 total 與 available 數量要合理。
3. members 表:新增 1 位管理員(role: 'admin')與 2 位一般會員(role: 'member')。
4. loans 表:新增 2 筆借閱紀錄(包含 'borrowed' 借出中與 'returned' 已還書狀態),且 member_id 與 book_id 必須對應剛新增的資料。

步驟二:Claude Code 生成的 seed.sql 範例

-- 測試資料灌入腳本
USE library_system;

-- 1. 書籍資料(5 本不同類別,total / available 數量合理)
INSERT INTO books (title, author, isbn, publish_year, category, total, available) VALUES
('台北人',             '白先勇',   '9789573317009', 1971, '文學小說', 3, 2), -- 1 本借出中
('資料庫系統概論',      '王大明',   '9789861234567', 2020, '程式設計', 5, 5),
('人類大歷史',          '哈拉瑞',   '9789869293898', 2014, '歷史',     2, 2), -- 借出後已歸還,補回庫存
('被討厭的勇氣',        '岸見一郎', '9789861371215', 2014, '心理勵志', 4, 4),
('三體',                '劉慈欣',   '9789573330006', 2008, '科幻小說', 3, 3);

-- 2. 會員資料(1 位管理員、2 位一般會員),password 欄位存放雜湊過的密碼,這裡只是測試用的假值
INSERT INTO members (name, email, password, role) VALUES
('管理員',   'admin@library.local',   '$2b$10$adminHashPlaceholder0000000000000000000000000', 'admin'),
('王小明',   'wang.member@library.local', '$2b$10$memberHashPlaceholder000000000000000000000000', 'member'),
('李小華',   'lee.member@library.local',  '$2b$10$memberHashPlaceholder100000000000000000000000', 'member');

-- 3. 借閱紀錄(1 筆借出中、1 筆已歸還),用子查詢帶入對應的 member_id / book_id,避免寫死流水號
-- 王小明借閱《台北人》,尚未歸還
INSERT INTO loans (member_id, book_id, borrowed_at, due_date, returned_at, status)
SELECT
    (SELECT id FROM members WHERE email = 'wang.member@library.local'),
    (SELECT id FROM books WHERE isbn = '9789573317009'),
    NOW(),
    DATE_ADD(CURDATE(), INTERVAL 14 DAY),
    NULL,
    'borrowed';
    
-- 李小華借閱《人類大歷史》,已歸還
INSERT INTO loans (member_id, book_id, borrowed_at, due_date, returned_at, status)
SELECT
    (SELECT id FROM members WHERE email = 'lee.member@library.local'),
    (SELECT id FROM books WHERE isbn = '9789869293898'),
    DATE_SUB(NOW(), INTERVAL 20 DAY),
    DATE_SUB(CURDATE(), INTERVAL 6 DAY),
    DATE_SUB(NOW(), INTERVAL 8 DAY),
    'returned';

步驟三:在 WSL2 環境中執行與驗證

  • 執行匯入指令
    回到 WSL2 終端機執行 seed.sql:
    cd ~/library-system
    sudo mysql -u root < sql/seed.sql
    
  • 登入 MySQL 驗證資料
    執行下方指令,確認三張表皆已成功灌入資料:
    sudo mysql -u root -e "USE library_system; SELECT id, title, available FROM books; SELECT id, name, role FROM members; SELECT * FROM loans\G"
    
    匯入假資料

今天透過 Claude Code 生成了具備子查詢動態對應外鍵的 seed.sql 腳本,並在 WSL2 環境下將測試資料灌入 books、members 與 loans 三張資料表中。有了這些樣品資料,資料庫的「骨架與肌肉」就建置完畢了。


上一篇
Day 8 建立資料表、資料庫與外鍵關聯
下一篇
Day 10 Claude 給的第一版 schema,我改了什麼
系列文
從零打造圖書管理系統:WSL2 × MySQL × Claude Code 的整合實作 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言