การรักษาความสมบูรณ์และความถูกต้องของข้อมูล (Data Integrity) คือหัวใจสำคัญของการพัฒนาระบบที่ใช้ฐานข้อมูล PostgreSQL ที่มีประสิทธิภาพ การปล่อยให้โค้ด SQL ที่มีข้อผิดพลาดทางไวยากรณ์ (Syntax) หรือข้อผิดพลาดเชิงตรรกะ (Logic) เข้าสู่ Repository โดยไม่ได้ตรวจสอบ ถือเป็นความเสี่ยงที่สูงมาก
บทความนี้จะแนะนำแนวทางการใช้ Git Pre-commit Hook เพื่อสร้างระบบการตรวจสอบอัตโนมัติ โดยให้มั่นใจว่าทุกครั้งที่นักพัฒนาทำการ Commit โค้ดที่เกี่ยวข้องกับ PostgreSQL จะต้องผ่านกระบวนการตรวจสอบความถูกต้องของ Schema และ Query ก่อนเสมอ
ทำความเข้าใจ Git Pre-commit Hooks
Git Hooks คือกลไกที่ช่วยให้เราสามารถกำหนดฟังก์ชันพิเศษให้ทำงานโดยอัตโนมัติเมื่อเกิดเหตุการณ์บางอย่างกับ Git Version Control System (VCS) โดยเฉพาะอย่างยิ่ง pre-commit hook คือสคริปต์ที่ถูกรันบนเครื่อง Local ของคุณทันทีที่คุณรันคำสั่ง git commit
- Purpose หลัก: เพื่อทำหน้าที่เป็นด่านหน้าในการตรวจสอบความถูกต้องของ Codebase ที่กำลังจะถูกบันทึก (Staged Files) ทำให้มั่นใจได้ว่าไม่มีข้อผิดพลาดพื้นฐานทางไวยากรณ์ของ SQL หรือการละเลยการอัปเดต Schema ที่สำคัญหลุดเข้าไปถึงสาขาหลัก (main branch)
- หลักการทำงาน: เมื่อคุณรัน
git commit, Git จะเรียกใช้สคริปต์ที่อยู่ใน.git/hooks/pre-commitหากสคริปต์นี้มี Exit Code เป็น 0 (Success) การ Commit จะดำเนินต่อไป แต่ถ้ามี Exit Code เป็นค่าอื่น (Failure) การ Commit จะถูกยกเลิกทันที
กลยุทธ์การตรวจสอบ PostgreSQL ด้วย Hook
แทนที่จะใช้ ShellCheck สำหรับ Bash Script เราจะใช้ Pre-commit Hook เพื่อรันสคริปต์ที่ทำหน้าที่ตรวจสอบไฟล์ SQL ที่ถูก Staging ไว้ โดยการตรวจสอบนี้อาจรวมถึง:
- Syntax Check: ตรวจสอบไวยากรณ์ SQL พื้นฐานว่าถูกต้องหรือไม่
- Schema Validation: ตรวจสอบว่าการสร้างตารางใหม่มีการกำหนด Primary Key และ Foreign Key อย่างครบถ้วนหรือไม่
- Data Integrity Check: ตรวจสอบว่า Query ที่มีการอัปเดตข้อมูล (UPDATE) มีการระบุเงื่อนไข (WHERE clause) เพื่อป้องกันการอัปเดตข้อมูลผิดพลาดหรือไม่
ตัวอย่างการใช้งาน (Conceptual Hook Script)
ในทางปฏิบัติ สคริปต์ Pre-commit Hook ที่เขียนด้วย Shell Script จะต้องเรียกใช้เครื่องมือตรวจสอบ PostgreSQL หรือรันคำสั่ง SQL Validation ที่เรากำหนดไว้ ตัวอย่างแนวคิดการทำงาน:
BASH / Shell
#!/bin/bash
# ตรวจสอบว่ามีไฟล์ .sql ที่ถูก staged หรือไม่
if git diff --cached --name-only --diff-filter=A | grep -q 'ileile.sql'; then
echo "[+] Running PostgreSQL Syntax and Schema Check..."
# ในความเป็นจริง จะมีการเรียกใช้เครื่องมือเฉพาะ เช่น sqlfluff หรือ psql -c "..."
# เพื่อตรวจสอบไฟล์ที่ถูก staged
if psql -v ON_ERROR_STOP=1 -c "SELECT 1 FROM pg_catalog.pg_class WHERE relname = 'users' AND primary_key = TRUE;" < staged_sql_file.sql; then
echo "[SUCCESS] PostgreSQL validation passed. Code is clean."
exit 0
else
echo "[ERROR] PostgreSQL validation failed. Please fix syntax or schema issues."
exit 1 # ยกเลิกการ commit
fi
else
echo "[INFO] No SQL files detected. Skipping PostgreSQL validation."
exit 0
fi
บทสรุปและแนวปฏิบัติที่ดีที่สุด
การใช้ Pre-commit Hooks เป็นการยกระดับมาตรฐานการทำงานของทีมพัฒนาอย่างมาก มันช่วยให้เราสามารถบังคับใช้กฎเกณฑ์ทางเทคนิคที่สำคัญ (เช่น การกำหนด Primary Key เสมอ, การใช้ Transaction Blocks) ได้ตั้งแต่ต้นทาง ก่อนที่โค้ดจะถูกผลักขึ้นสู่สาขาหลัก การตั้งค่า Hook เหล่านี้ไม่ได้เป็นเพียงแค่การตรวจสอบไวยากรณ์ แต่เป็นการสร้าง ‘ตาข่ายนิรภัย’ (Safety Net) ให้กับฐานข้อมูลของคุณ ทำให้ระบบ PostgreSQL ของคุณมีความเสถียรและเชื่อถือได้ในระดับ Senior Architect ครับ