Kotchasan Framework Documentation

Kotchasan Framework Documentation

SQLiteDriver Class

TH 05 Feb 2026 06:23

SQLiteDriver Class

ภาพรวม

คลาส Kotchasan\Connection\SQLiteDriver เป็นไดรเวอร์เฉพาะสำหรับฐานข้อมูล SQLite รองรับฟีเจอร์ของ SQLite เช่น การทำงานกับไฟล์ฐานข้อมูล การจัดการ sequences และ SQL functions ที่เฉพาะเจาะจง

การติดตั้งและความต้องการ

ความต้องการ

  • PHP 7.4 หรือสูงกว่า
  • PDO SQLite extension (pdo_sqlite)
  • SQLite 3.7+

การตั้งค่าการเชื่อมต่อ

การตั้งค่าพื้นฐาน

use Kotchasan\Connection\SQLiteDriver;

$config = [
    'database' => '/path/to/database.sqlite'
];

$driver = new SQLiteDriver();
$connected = $driver->connect($config);

การใช้งาน In-Memory Database

$config = [
    'database' => ':memory:' // ฐานข้อมูลในหน่วยความจำ
];

$driver = new SQLiteDriver();
$connected = $driver->connect($config);

ฟีเจอร์เฉพาะ SQLite

การเพิ่มประสิทธิภาพฐานข้อมูล

// SQLite ใช้ VACUUM
$success = $driver->optimizeTable('users');
// ทำงานเป็น: VACUUM (ทั้งฐานข้อมูล);

การล้างข้อมูลตาราง

// SQLite ไม่รองรับ TRUNCATE ใช้ DELETE แทน
$success = $driver->emptyTable('temp_data');
// ทำงานเป็น: DELETE FROM "temp_data" และรีเซ็ต sqlite_sequence;

SQL Functions สำหรับ SQLite

ฟังก์ชันวันที่และเวลา

// ดึงปี (ใช้ strftime)
$yearFunc = $driver->formatSqlFunction('YEAR', ['column' => 'created_at'], 'year_created');
// ผลลัพธ์: CAST(strftime('%Y', "created_at") AS INTEGER) AS "year_created"

// วันที่ปัจจุบัน
$nowFunc = $driver->formatSqlFunction('NOW', [], 'current_time');
// ผลลัพธ์: DATETIME() AS "current_time"

// จัดรูปแบบวันที่
$formatFunc = $driver->formatSqlFunction('DATE_FORMAT', [
    'column' => 'created_at',
    'format' => '%Y-%m-%d'
], 'formatted_date');
// ผลลัพธ์: strftime('%Y-%m-%d', "created_at") AS "formatted_date"

ฟังก์ชันข้อความ

// รวมข้อความ (ใช้ ||)
$concatFunc = $driver->formatSqlFunction('CONCAT', [
    'fields' => ['first_name', 'last_name'],
    'separator' => ' '
], 'full_name');
// ผลลัพธ์: ("first_name" || ' ' || "last_name") AS "full_name"

// รวมข้อความแบบกลุ่ม
$groupConcatFunc = $driver->formatSqlFunction('GROUP_CONCAT', [
    'column' => 'tag_name',
    'separator' => ', '
], 'tags');
// ผลลัพธ์: GROUP_CONCAT("tag_name", ', ') AS "tags"

ฟังก์ชันอื่นๆ

// สุ่ม
$randFunc = $driver->formatSqlFunction('RAND', [], 'random_value');
// ผลลัพธ์: RANDOM() AS "random_value"

// จัดการค่า NULL
$ifnullFunc = $driver->formatSqlFunction('IFNULL', [
    'column1' => 'nickname',
    'column2' => 'first_name'
], 'display_name');
// ผลลัพธ์: IFNULL("nickname", "first_name") AS "display_name"

// ความแตกต่างของวันที่
$datediffFunc = $driver->formatSqlFunction('DATEDIFF', [
    'column1' => 'end_date',
    'column2' => 'start_date'
], 'duration');
// ผลลัพธ์: (JULIANDAY("end_date") - JULIANDAY("start_date")) AS "duration"

ตัวอย่างการใช้งาน

การสร้างฐานข้อมูลใหม่

$config = [
    'database' => '/var/data/new_app.sqlite'
];

$driver = new SQLiteDriver();

if ($driver->connect($config)) {
    // สร้างตาราง
    $sql = "
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            email TEXT UNIQUE NOT NULL,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP
        )
    ";

    $stmt = $driver->prepare($sql);
    $stmt->execute();

    echo "ฐานข้อมูลและตารางสร้างสำเร็จ";
}

การทำงานกับ Auto-increment

// INSERT และดึง ID ล่าสุด
$stmt = $driver->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute(['John Doe', 'john@example.com']);
$newId = $driver->lastInsertId(); // ไม่ต้องระบุ sequence name;

การสำรองฐานข้อมูล

function backupSQLiteKotchasan\Database($sourcePath, $backupPath) {
    // คัดลอกไฟล์ฐานข้อมูล
    if (copy($sourcePath, $backupPath)) {
        return true;
    }
    return false;
}

// ใช้งาน
$backupSuccess = backupSQLiteKotchasan\Database(
    '/var/data/app.sqlite',
    '/var/backups/app_' . date('Y-m-d_H-i-s') . '.sqlite'
);

การจัดการข้อผิดพลาด

try {
    $driver->connect($config);
} catch (\PDOException $e) {
    $message = $e->getMessage();

    if (strpos($message, 'unable to open database file') !== false) {
        echo "ไม่สามารถเปิดไฟล์ฐานข้อมูล";
    } elseif (strpos($message, 'database is locked') !== false) {
        echo "ฐานข้อมูลถูกล็อค";
    } elseif (strpos($message, 'disk I/O error') !== false) {
        echo "ข้อผิดพลาดการอ่าน/เขียนดิสก์";
    } else {
        echo "ข้อผิดพลาด SQLite: " . $message;
    }
}

การปรับแต่งประสิทธิภาพ

การตั้งค่า PRAGMA

// ตั้งค่าประสิทธิภาพ
$pragmas = [
    "PRAGMA journal_mode = WAL",           // Write-Ahead Logging
    "PRAGMA synchronous = NORMAL",         // ความปลอดภัยปานกลาง
    "PRAGMA cache_size = 10000",           // ขนาด cache
    "PRAGMA temp_store = MEMORY",          // เก็บ temp ในหน่วยความจำ
    "PRAGMA mmap_size = 268435456"         // Memory-mapped I/O
];

foreach ($pragmas as $pragma) {
    $driver->prepare($pragma)->execute();
}

การใช้ Index

// สร้าง index
$sql = "CREATE INDEX IF NOT EXISTS idx_user_email ON users (email)";
$driver->prepare($sql)->execute();

// ตรวจสอบ index
$sql = "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='users'";
$stmt = $driver->prepare($sql);
$result = $stmt->execute();

คำแนะนำและข้อควรระวัง

แนวทางปฏิบัติที่ดี

  1. ใช้ WAL Mode: เปิดใช้งาน WAL mode สำหรับประสิทธิภาพ
  2. สำรองข้อมูล: สำรองไฟล์ฐานข้อมูลเป็นประจำ
  3. ใช้ Transaction: ใช้ transaction สำหรับการทำงานหลายขั้นตอน
  4. ตั้งค่า PRAGMA: ปรับแต่ง PRAGMA settings

ข้อควรระวัง

  1. File Permissions: ตรวจสอบสิทธิ์การเข้าถึงไฟล์
  2. Concurrent Access: ระวังการเข้าถึงพร้อมกัน
  3. Database Size: ระวังขนาดฐานข้อมูลที่ใหญ่เกินไป

ปัญหาที่พบบ่อย

  1. Database Locked: ปิดการเชื่อมต่อให้เรียบร้อย
  2. File Path: ตรวจสอบ path ของไฟล์ฐานข้อมูล
  3. Disk Space: ตรวจสอบพื้นที่ดิสก์

คลาสที่เกี่ยวข้อง

  • Connection - คลาสการเชื่อมต่อพื้นฐาน
  • DriverInterface - อินเทอร์เฟซไดรเวอร์
  • MySQLDriver - ไดรเวอร์ MySQL