Kotchasan Framework Documentation
SQLiteDriver Class
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();คำแนะนำและข้อควรระวัง
แนวทางปฏิบัติที่ดี
- ใช้ WAL Mode: เปิดใช้งาน WAL mode สำหรับประสิทธิภาพ
- สำรองข้อมูล: สำรองไฟล์ฐานข้อมูลเป็นประจำ
- ใช้ Transaction: ใช้ transaction สำหรับการทำงานหลายขั้นตอน
- ตั้งค่า PRAGMA: ปรับแต่ง PRAGMA settings
ข้อควรระวัง
- File Permissions: ตรวจสอบสิทธิ์การเข้าถึงไฟล์
- Concurrent Access: ระวังการเข้าถึงพร้อมกัน
- Database Size: ระวังขนาดฐานข้อมูลที่ใหญ่เกินไป
ปัญหาที่พบบ่อย
- Database Locked: ปิดการเชื่อมต่อให้เรียบร้อย
- File Path: ตรวจสอบ path ของไฟล์ฐานข้อมูล
- Disk Space: ตรวจสอบพื้นที่ดิสก์
คลาสที่เกี่ยวข้อง
- Connection - คลาสการเชื่อมต่อพื้นฐาน
- DriverInterface - อินเทอร์เฟซไดรเวอร์
- MySQLDriver - ไดรเวอร์ MySQL