ป้ายกำกับ: ไม่เข้ากัน

Shell Script: ดูวิธีตั้งค่า Git Pre-commit Hook สำหรับ ShellCheckShell Script: ดูวิธีตั้งค่า Git Pre-commit Hook สำหรับ ShellCheck

การรักษาความสมบูรณ์และความถูกต้องของข้อมูล (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 ไว้ โดยการตรวจสอบนี้อาจรวมถึง:

  1. Syntax Check: ตรวจสอบไวยากรณ์ SQL พื้นฐานว่าถูกต้องหรือไม่
  2. Schema Validation: ตรวจสอบว่าการสร้างตารางใหม่มีการกำหนด Primary Key และ Foreign Key อย่างครบถ้วนหรือไม่
  3. 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 ครับ