Досвід роботи з SQLite в PHP

web-розробка Автор: Роман Голубовський

Теги : , , , , , , ,

Спочатку трохи предісторії.

Так вже склалось, що найчастіше (принаймні у нас) динамічні веб-сайти розробляються на зв’язці популярних технологій PHP/MySQL (блог, який ви зараз читаєте – не виключення). Саме тому, коли потрібно розробити веб-сервіс, що потребує використання бази даних, якось навіть не задумуєшся, яка саме СКБД повинна бути, а по-інерції розробляєш на вже звичній MySQL. І коли веб-сервіс майже готовий, раптом виявляється, що замовникам не підходить MySQL (та і будь-яка інша зовнішня БД) з приводу безпеки, а потрібно щоб база даних зберігалась у файлах там же, де і решта скриптів веб-сервісу. Після обмірковування можливостей око замовників падає на SQLite. І ось у мене нове завдання – зробити так, щоб вже готовий веб-сервіс з БД на базі MySQL запрацював з SQLite.

sqlite

Якби у мене було трошки менше досвіду, це рішення завдало б мені чимало клопотів та нової мороки. Але, на щастя, я знаю що таке архітектура MVC (Model View Controller), і практикую її при побудові веб-аплікацій. Саме тому з задачею зміни бази даних для проекту я справився досить швидко, отримавши при цьому новий досвід. Весь процес обмежився вивченням SQLite під PHP та зміни класу, що взаємодіє з базою даних.

Тепер розповім про саму БД SQLite

SQLite – це бібліотека, що підтримує більшість специфікацій SQL92. SQLite зберігає дані в єдиному файлі – у цьому її особливість. Бібліотека є маленькою та швидкою. На відміну від інших БД, що підтримуються PHP, при керуванні SQLite не створюється окремого процесу сервера – php-програма і є сервером. Це значить, що одночасні запроси повинні блокувати файл для безпечної зміни БД. Це дуже важливо, адже стосується сфери використання SQLite – при одночасному считуванні даних немає жодних проблем, але при великій кількості одночасних оновлень в БД, програма буде витрачати більше часу на синхронізацію блокування файлів ніж робити корисну роботу.

Можливості SQLite:
- Підтримка більшої частини стандарту SQL92, включаючи тригери і транзакції
- Підтримується БД до 2 терабайт
- Відкриті коди (open source)
- Система відкату

Серед переваг SQLite – відсутність потреби у встановленні та адмініструванні СКБД (на відміну від MySQL, PostageSQL чи Oracle), і відповідно можливість використовувати на хостінгових пакетах, що не підтримують сторонні БД. Зберігаючи всі дані в одному файлі, SQLite дозволяє швидко організувати власну БД. Великі проекти також можуть отримати перевагу від використання SQLite завдяки її швидкості та універсальності, так на php.net використовується саме ця БД для онлайн пошуку. Також SQLite успішно використовується в ролі бази даних на гаджетах, що потребують запамятовування – таких як телефони, PDA чи mp3 плеєри. На сайті SQLite можна знайти ряд компаній, що користуються бібліотекою – це такі гіганти як Aple, Google, Microsoft, Skype, Symbian тощо.

Маленька. Швидка. Надійна. – саме так написано про SQLite на офіційному сайті.

Мені не довелось використати всіх можливостей SQLite, але скажу лише, шо труднощів працювати з бібліотекою не було.

Основна відмінність SQLite від інших БД – в SQLite немає типів даних. Хоча типи стовбців можна вказувати при створенні таблиці – VARCHAR, TEXT, INTEGER, FLOAT і т.д., вони будуть братись до уваги лише при сортуванні та порівнянні даних – тоді розрізняються текстові та числові значення даних, які й порівнюються по-різному.

Для демонстрації використання SQLite, приведу простий приклад коду на PHP:

<?php
 
// Потрібна можливість запису в каталог, у якому буде розміщено базу даних
define('DB_ADDR', 'db/database.db');
 
// Відкрити БД або створити якщо вона не існує
$db = sqlite_open(DB_ADDR) or die("Failed to open/create the database");
 
// Створюємо таблицю (в ній будуть ті, хто підписався на уявну розсилку новин)
$query = "
	CREATE TABLE subscribers(
		datetime VARCHAR,
		name VARCHAR,
		email VARCHAR,
		status INTEGER
	);
";
// Мало чим відрізняється від mysql_query():
sqlite_query($db, $query);
 
// Запис даних в БД. Будем вважати що ім'я та електронна адреса введена користувачами, саме тому їх екрануємо
$cubscribers_arr = array(
	0 => array(
			'name' => 'Roman',
			'email' => 'mail@example.com'
		),
	1 => array(
			'name' => 'Vasyl',
			'email' => 'mail2@example.com'
		)
);
foreach($cubscribers_arr as $v) {
	$query = "
		INSERT INTO subscribers
		(datetime, name, email, status)
		VALUES
		('".time()."', '".sqlite_escape_string($v['name'])."', '".sqlite_escape_string($v['email'])."', '1');
	";
	sqlite_query($db, $query);
}
 
// Вивід інформації з БД
$query = "
	SELECT datetime, name, email
	FROM subscribers
	WHERE status == '1'
	ORDER BY name ASC
";
$result = sqlite_query($db, $query);
if($result) {
	while($row = sqlite_fetch_array($result)) {
		echo $row['name'].' <'.$row['email'].'> are subscribed at '.date("Y-m-d H:i", $row['datetime']).'<br />';
	}
}
?>

Як видно з приведеного коду, нічого складного немає – функції PHP для роботи з SQLite виглядають схоже на функції для роботи з MySQL, тому не потребують окремого спеціалізованого вивчення. Тобто достатньо знати сам SQL, і кілька основних функцій PHP для взаємодії з SQLite для повноцінної роботи з цією БД.

Окремої розмови потребує тема зберігання часу в SQLite. Оскільки спеціального типу даних для зберігання дати та часу в SQLite немає, такі дані зберігаються як текст – або у форматі UNIX timestamp – генерується функцією PHP time() або у форматі ISO – виглядає як 2009-06-14 19:26:19

Отож, буду резюмувати, що SQLite як БД цілком придатна для використання на невеликих базах даних з нескладними таблицями і при нескладних запитах (для інших поки не випробовував) і що в таких випадках особливо не відрізняється від звичного для мене MySQL.

Ну і наостанок кілька практичних порад щодо організації розробки під веб.

По-перше, з’ясовуйте наперед з замовниками такі деталі, як те, де будуть зберігатись дані – у файлах чи базі даних, якій саме БД (хоча, це більше стосується специфічних веб-проектів а не звичайних веб-сайтів).

По-друге, застосовуючи архітектуру MVC у своїй роботі ви отримуєте ряд переваг, одна з яких описана у предісторії до цієї статті. Тому старайтесь слідувати архітектурі проектування, при якій всі функції по роботі з БД (Model) описуються в одному місці, всі функції що відповідають за вигляд (View) – в другому, а код,и що реалізовує бізнес-логіку програм (Controller) в третьому.

Якщо у вас є досвід роботи з SQLite, цікаво буде почитати про нього в коментарях.

От і все, про що я хотів сьогодні написати. Дякую за увагу. Більше про SQLite можна прочитати на:

sqlite.org (en)

php.net (ru)

wikipedia.org (ua)

Схожі статті

Сподобалась стаття - підпишись на оновлення по RSS, на пошту або в ЖЖ!

Коментувати