Pair Programming: ระบบบริหารจัดการ Course เรียน Online
ความเป็นมา
นักศึกษาได้รับมอบหมายให้พัฒนาระบบบริหารจัดการ Course เรียน Online โดยต้องเชื่อมต่อกับฐานข้อมูล PostgreSQL ระบบนี้จะช่วยให้ผู้ใช้สามารถสร้าง ค้นหา อัพเดต และลบ Course เรียนได้
ข้อกำหนด
- เขียนโค้ดในภาษา Go เชื่อมต่อกับ PostgreSQL
- ใช้ Prepared Statements หรือ Parameterized Queries เพื่อป้องกัน SQL Injection
- กำหนดการตั้งค่า Connection Pooling อย่างเหมาะสม
- ใช้ Context with Timeout สำหรับการเรียกใช้งาน Database
- ออกแบบโครงสร้างโค้ดโดยใช้หลักการ Interface
ส่วนที่ต้องพัฒนา
- สร้าง Interface
CourseDatabase
type CourseDatabase interface {
GetCourse(ctx context.Context, id int) (*Course, error)
GetAllCourses(ctx context.Context) ([]*Course, error)
CreateCourse(ctx context.Context, course *Course) (int, error)
UpdateCourse(ctx context.Context, id int, course *Course) error
DeleteCourse(ctx context.Context, id int) error
Close() error
}
- สร้าง Struct
Course
type Course struct {
ID int
Title string
Description string
Price float64
Instructor string
CreatedAt time.Time
UpdatedAt time.Time
}
- สร้าง Struct
PostgresCourseDatabase
ที่ implementCourseDatabase
interface - สร้าง Function
NewPostgresCourseDatabase
Function นี้จะรับ Connection String และสร้าง PostgresCourseDatabase ที่มีการตั้งค่า Connection Pooling
- พัฒนาการทำงานของฟังก์ชัน CRUD ทั้งหมด
- GetCourse สำหรับค้นหา Course ตาม ID
- GetAllCourses สำหรับดึงข้อมูล Course ทั้งหมด
- CreateCourse สำหรับสร้าง Course ใหม่และคืนค่า ID
- UpdateCourse สำหรับอัพเดตข้อมูล Course
- DeleteCourse สำหรับลบ Course
- เขียน Main Function เพื่อทดสอบการทำงาน
โครงสร้างฐานข้อมูล
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
instructor VARCHAR(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- สร้าง function สำหรับอัพเดท updated_at โดยอัตโนมัติ
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'plpgsql';
-- สร้าง trigger เพื่อเรียกใช้ function update_modified_column
CREATE TRIGGER update_courses_modtime
BEFORE UPDATE ON courses
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();
ตัวอย่างโค้ดเริ่มต้น
package main
import (
"context"
"database/sql"
"fmt"
"log"
"time"
_ "github.com/lib/pq"
)
// Course โครงสร้างข้อมูลของคอร์สเรียน
type Course struct {
ID int
Title string
Description string
Price float64
Instructor string
CreatedAt time.Time
UpdatedAt time.Time
}
// CourseDatabase interface สำหรับการทำงานกับฐานข้อมูลคอร์สเรียน
type CourseDatabase interface {
GetCourse(ctx context.Context, id int) (*Course, error)
GetAllCourses(ctx context.Context) ([]*Course, error)
CreateCourse(ctx context.Context, course *Course) (int, error)
UpdateCourse(ctx context.Context, id int, course *Course) error
DeleteCourse(ctx context.Context, id int) error
Close() error
}
// PostgresCourseDatabase implements CourseDatabase interface โดยใช้ PostgreSQL
type PostgresCourseDatabase struct {
db *sql.DB
}
// NewPostgresCourseDatabase สร้าง PostgresCourseDatabase instance ใหม่
func NewPostgresCourseDatabase(connStr string) (*PostgresCourseDatabase, error) {
// TODO เขียนโค้ดเชื่อมต่อกับฐานข้อมูลและตั้งค่า connection pooling
return nil, nil
}
// GetCourse ดึงข้อมูลคอร์สตาม ID
func (pdb *PostgresCourseDatabase) GetCourse(ctx context.Context, id int) (*Course, error) {
// TODO เขียนโค้ดดึงข้อมูลคอร์สจากฐานข้อมูล
return nil, nil
}
// GetAllCourses ดึงข้อมูลคอร์สทั้งหมด
func (pdb *PostgresCourseDatabase) GetAllCourses(ctx context.Context) ([]*Course, error) {
// TODO เขียนโค้ดดึงข้อมูลคอร์สทั้งหมดจากฐานข้อมูล
return nil, nil
}
// CreateCourse สร้างคอร์สใหม่
func (pdb *PostgresCourseDatabase) CreateCourse(ctx context.Context, course *Course) (int, error) {
// TODO เขียนโค้ดเพิ่มคอร์สใหม่ลงฐานข้อมูล และคืนค่า ID ที่สร้างขึ้น
return 0, nil
}
// UpdateCourse อัพเดตข้อมูลคอร์ส
func (pdb *PostgresCourseDatabase) UpdateCourse(ctx context.Context, id int, course *Course) error {
// TODO เขียนโค้ดอัพเดตข้อมูลคอร์สในฐานข้อมูล
return nil
}
// DeleteCourse ลบคอร์สตาม ID
func (pdb *PostgresCourseDatabase) DeleteCourse(ctx context.Context, id int) error {
// TODO เขียนโค้ดลบคอร์สจากฐานข้อมูล
return nil
}
// Close ปิดการเชื่อมต่อกับฐานข้อมูล
func (pdb *PostgresCourseDatabase) Close() error {
// TODO เขียนโค้ดปิดการเชื่อมต่อกับฐานข้อมูล
return nil
}
func main() {
// ทดสอบการทำงานของ CourseDatabase
// TODO เขียนโค้ดทดสอบการเรียกใช้งานฟังก์ชันทั้งหมด
}
เกณฑ์การประเมิน
- ความถูกต้องของการเชื่อมต่อกับฐานข้อมูล
- การใช้ Prepared Statements/Parameterized Queries เพื่อป้องกัน SQL Injection
- การตั้งค่า Connection Pooling ที่เหมาะสม
- การใช้ Context with Timeout อย่างถูกต้อง
- การเขียนโค้ดที่สอดคล้องกับ Interface ที่กำหนด
- ความสมบูรณ์ของการทำงานตาม requirements