Простое использование SQLite. А вот я нашел ошибку! Как рапортовать

SQLite - это база данных, чем-то похожая на MySQL. Принципиальное отличие SQLite от других БД в том, что вся база представляет собой один файл. Если в MySQL база хранится где-то в дебрях сервера и недоступна для переноса, то в SQLite с этим всё до безобразия просто: один файл - одна база.

Конечно же, сервер должен поддерживать драйвер SQLite (также как и любой другой БД), но как правило сейчас с этим проблем нет.

SQLite позволяет привычно работать с базой через SQL, создавать таблицы, поля и т.д. В целом можно сказать, что SQLite ни в чем не уступает привычной MySQL, за исключением, пожалуй более медленной работы с «тяжелыми» sql-запросами по обновлению данных (insert и update). Но, опять же, это для высоконагруженных сайтов.

Огромным плюсом SQLite будет её легкая переносимость. Скопировать файл - что может быть проще? Не нужно заботиться о бэкапах, как в MySQL, не нужно создавать на сервере пользователя с паролем, не нужно создавать саму базу. С SQLite просто берём и пользуемся.

Для работы с базой данных в PHP лучше использовать PDO - Объекты данных PHP - это т.н. абстракция, которая предлагает единый интерфейс для работы с разными базами. В теории, используя PDO, можно переключиться на любую базу, не переделывая SQL-запросы, например с MySQL на SQLite. Меняются только параметры подключения.

Таким образом SQLite будет подключаться через PDO. Для этого ничего не требуется, поскольку сам PDO уже в составе PHP, а драйвер SQLite, как правило, также включен на серверах.

Но, прежде, чем приступать к программированию, нужно создать саму базу. Например для MySQL существует phpMyAdmin, через который можно выполнять различные операции. Для SQLite также есть похожие разработки, но я покажу, как можно это делать через браузер FireFox. Для этого потребуется только установить дополнение .

Чтобы добавить это дополнение в основное меню FireFox («гамбургер»), нажмите Изменить и перетащите мышью икноку в меню.

На этом установлен и можно им пользоваться.

Для начала создадим новую базу данных. В SQLite - это отдельный файл, который будет иметь расширение.sqlite . SQLite Manager предложит указать каталог, где будет храниться этот файл. Выберите или создайте новый каталог. Для нас это пока не имеет особого значения. В результате будет создан sqlite-файл с новой базой.

Этот файл можно перемещать (и переименовывать) куда угодно, а после открывать командой меню Базы данных - Подключить базу данных .

Теперь нужно создать таблицу (или таблицы) в базе данных.

SQLite Manager автоматом создаёт служебные таблицы sqlite_XXX . Мы их не трогаем и нам они не мешают.

Таблица в БД - это то место, где хранится структурированная информация. Таблица должна иметь набор полей с заданными свойствами. Например поле может быть integer - для целых чисел, или text - для текста. Количество полей может быть произвольным и определяется только задачей вебмастера.

Пусть, например, у нас будет таблица pages с полями

  • id - уникальный номер (автоинкремент)
  • slug - ссылка
  • text - произвольный текст
  • hits - число просмотров

После того, как таблица создана, обратите внимание на блок «SQL-оператор создавший этот объект». В нем будет SQL-запрос, которым можно создать таблицу. Он может пригодится, если требуется создать таблицу в базе через PHP.

На вкладке «Просмотр и Поиск» можно редактировать таблицу. Создадим для примера две строчки, где поле slug будет home и contact . Это будут две страницы: главная и сайт/contact .

Поле hits будет содержать счетчик просмотров страницы. Текст может быть любым.

Всё, база готова, теперь можно её использовать.

Поставим задачу. Пусть у нас будет простенький сайт, который будет выдавать по короткой ссылке (slug) соответствующий текст и количество просмотров.

Если мы делаем это на локальном сервере, то пусть сайт будет в каталоге sqlite . В нём подкаталог db , куда мы и скопируем наш pages.sqlite .

Роутинг мы можем сделать, как описано в предыдущей статье . Файл.htaccess

AddDefaultCharset UTF-8 Options -Indexes RewriteEngine on RewriteBase /sqlite/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) /sqlite/index.php?$1

В index.php сам роутинг будет описан одной строчкой:

$page = ($p = key($_GET)) ? $p: "home";

  • подключаем базу
  • делаем в ней выборку по $page
  • выводим полученные данные
Я намеренно упрощаю алгоритм, чтобы не усложнять php-код.

Существуют два варианта работы с БД. Первый - это нативный php-код. Он не очень сложный, но обилие параметров немного напрягает. Поэтому второй вариант - использование дополнительных библиотек-оберток. С ними код становится лаконичней.

Приведу код index.php в первом варианте:

setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $sql ="SELECT * FROM pages WHERE slug=:page LIMIT 1"; $sth = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); $sth->execute(array(":page" => $page)); $rows = $sth->fetchAll(); print_r($rows); // здесь выводим данные } catch(Exception $e) { echo $e->getMessage(); } # end of file

Для второго варианта я использовал php-библиотеку с сайта labaka.ru , которую разместил в подкаталог lib .

Код index.php:

Данный пример будет выводить для разных адресов разный текст и при этом будет работать счетчик просмотров. Если требуется добавить новую страницу, то её достаточно создать в базе. Для удобства, в SQLite Manager можно подключить базу прямо из каталога сайта.

Здесь следует отметить пару важных моментов.

В первую очередь, вся работа с PDO должна заключаться в блок try..catch . Таким способом отлавливаются сообщения об ошибках.

Данные, которые отправляются в sql-запрос должны проходить через валидацию. В PDO, когда используется предподготовка данных (PDO::prepare), выполняется принудительное экранирование параметров. Это позволяет защититься от возможных SQL-инъекций.

Когда происходит подключение базы данных SQLite, в случае отсутствия файла базы, он будет создан автоматически. На этом базируется создание базы сразу после его подключения и создание нужных таблиц первым sql-запросом (о котором я написал выше).

Еще одно замечание по SQLite. Поскольку база это файл, то его можно скачать по URL прямо через браузер. Поэтому каталог с SQLite-файлами лучше защищать через.htaccess строчкой Deny from all . Или же размещать выше чем основной www-каталог.

SQLite может пригодится для небольших задач, которые требуют небольшой базы данных: счетчики, голосования, мета-данные страниц и т.п.

Вы можете к этой статье.

Введение

SQLite – это реляционная база данных, запросы к которой можно осуществлять при помощи языка запросов SQL. База данных не поддерживает все особенности SQL и уступает в функциональности другим развитым СУБД, но вполне подходит для хранения и извлечения информации.

Отличие SQLite от MySQL и аналогичных СУБД

Классические СУБД, такие как MySQL (а так же MS SQL, Oracle, PostgreeSQL) состоят из отдельного сервера, поддерживающего работу базы данных и прослушивающих определённый порт, на предмет обращения клиентов. В качестве клиента может выступать в том числе и расширение PHP, реализующего интерфейс, с помощью которого осуществляются запросы к базе. Движок SQLite и интерфейс к ней реализованы в одной библиотеке, что увеличивает скорость выполнения запросов. Такой сервер часто называют встроенным .

Замечание

Встроенный сервер имеется и у других баз данных, например, у MySQL, но его использование требует лицензионных отчислений, поэтому не получило широкое распространение в мире открытых исходных кодов.

SQLite является бестиповой базой данных. Точнее, есть только два типа – целочисленный "integer" и текстовый "text". Причём "integer" используется преимущественно для первичного ключа таблицы, а для остальных данных пойдёт "text". Длина строки, записываемой в текстовое поле, может быть любой.

Особенности SQLite

Все базы данных хранятся в файлах, по одному файлу на базу. Количество баз данных, а так же таблиц в них, ограниченно только свободным местом, имеющимся на сайте. А максимально возможный объём одной базы данных составляет 2 Тб.

Так как все данные хранятся в файлах, проблем с переносом базы данных с одного хостинга на другой не существует – достаточно лишь скопировать соответствующие файлы.

Установка SQLite

В PHP5 поддержка SQLite установлена и включена по умолчанию.

Установка под Windows: Для установки SQLite необходимо скачать и скопировать в папку с расширениями библиотеку "php_sqlite.dll", которую можно загрузить по ссылке: http://snaps.php.net/win32/PECL_STABLE/php_sqlite.dll . Затем необходимо раскомментировать (или добавить) строку "extension=php_sqlite.dll" в файле "php.ini". Для нормального функционирования SQLite также необходимо раскомментировать строку "extension=php_pdo.dll".

Замечание

Замечание

Библиотека "php_pdo.dll" должна загружаться до загрузки "php_sqlite.dll". То есть в php.ini строка "extension=php_sqlite.dll" должна стоять после "extension=php_pdo.dll".

Установка под Unix: Скачайте свежую версию SQLite с официального сайта (http://sqlite.org/download.html). Прочтите файл "INSTALL", поставляемый с исходными тестами модуля. Или просто воспользуйтесь командой установки PEAR: "pear install sqlite".

Работа с SQLite

Создание базы данных: Для того чтобы создать новую базу данных необходимо воспользоваться функцией sqlite_open(). Если базы, имя которой указано в параметре "filename" не существует, то функция создаст новую базу данных с именем "filename" и вернёт идентификатор базы данных.

Resource sqlite_open (string filename [, int mode [, string &error_message]])

В скрипте, преведённом ниже, демонстрируется создание новой базы данных:

// Создадим базу данных

if (! $db ) exit("Не удалось создать базу данных!" );
?>

В результате в папке со скриптом у нас появится файл с именем "my_database.db" – наша база данных.

Создание таблиц: Все запросы к базе данных выполняет функция sqlite_query(), которая имеет следующий синтаксис:

Resource sqlite_query (resource dbhandle, string query)

Замечание

Для работы с SQLite, как и любой реляционной базой данных используется язык запросов SQL. Поэтому создать таблицу данных можно при помощи традиционного запроса CREATE TABLE, вставить запись при помощи оператора INSERT, извлечь запись при помощи SELECT, а обновить существующую запись при помощи запроса UPDATE.

В приведённом ниже примере создаётся таблица table1, содержащая три поля: целочисленное поле id, которое выступает в качестве первичного ключа, и два текстовых поля field1 и field2.

$db = sqlite_open ("my_database.db" );
if (! $db ) exit();
"CREATE TABLE table1
(id INTEGER PRIMARY KEY,
field1 TEXT,
field2 TEXT);
"
);
if (! $query_table ) exit();
$query_insert = sqlite_query ($db , "INSERT INTO table1(field1, field2) VALUES ("PHP5", "Apache");" );
if (! $query_insert ) exit("Невозможно записать данные в таблицу!" );
?>

После создания таблицы, в неё добавляется запись, содержащая строки "PHP5" и "Apache", поле id автоматически получает значение 1.

Вывод данных из базы: Для вывода данных из таблиц используется всё та же функция – sqlite_query(). Если выбирается несколько записей, результат выборки следует обработать при помощи цикла while() и функции sqlite_fetch_array(), которая имеет следующий синтаксис:

Array sqlite_fetch_array (resource result [, int result_type [, bool decode_binary]])

Ниже приводится скрипт, демонстрирующий вывод нескольких записей из базы данных:

// Создадим новую базу данных
$db = sqlite_open ("my_database.db" );
if (! $db ) exit("Невозможно создать базу данных!" );
// Создадим таблицу "table1" в базе
$query_table = sqlite_query ($db , "CREATE TABLE table1
(id INTEGER PRIMARY KEY,
/* id автоматически станет автоинкрементным */
field1 TEXT,
field2 TEXT);
"
);
if (! $query_table ) exit("Невозможно создать таблицу в базе данных!" );
// Запишем что-нибудь в таблицу
sqlite_query ($db , );
sqlite_query ($db , );
sqlite_query ($db , );
// Сделаем выборку данных
$res = sqlite_query ($db , "SELECT * FROM table1;" );
while ($array = sqlite_fetch_array ($res ))
{

" );
}
?>

В результате работы скрипта получим:

PHP5+Apache (id записи:1)

Редактрирование записи : Для изменения поля воспользуемся функцией sqlite_query() и передадим ей запрос на обновление (UPDATE).

// Создадим новую базу данных
$db = sqlite_open ("my_database.db" );
if (! $db ) exit("Невозможно создать базу данных!" );
// Создадим таблицу "table1" в базе
$query_table = sqlite_query ($db , "CREATE TABLE table1
(id INTEGER PRIMARY KEY,
/* id автоматически станет автоинкрементным */
field1 TEXT,
field2 TEXT);
"
);
if (! $query_table ) exit("Невозможно создать таблицу в базе данных!" );
// Запишем что-нибудь в таблицу
sqlite_query ($db , "INSERT INTO table1(field1, field2) VALUES ("PHP5+", "Apache");" );
sqlite_query ($db , "INSERT INTO table1(field1, field2) VALUES ("SQLite – ", "классная вещь");" );
sqlite_query ($db , "INSERT INTO table1(field1, field2) VALUES ("Посетите ", "sqlite.org");" );
// Изменим поле с id=1
sqlite_query ($db , "UPDATE table1 SET field2="Apache+Linux" WHERE id=1;" );
// Сделаем выборку данных

// В цикле выведем все полученные данные

{
echo($array [ "field1" ]. $array [ "field2" ]. " (id записи:" . $array [ "id" ]. ")
" );
}
?>

В результате получим:

PHP5+Apache+Linux (id записи:1)
SQLite – классная вещь (id записи:2)
посетите sqlite.org (id записи:3)

Удаление записи из таблицы : Чтобы удалить запись из таблицы, нужно передать функции sqlite_query() запрос на удаление (DELETE).

// Создадим новую базу данных
$db = sqlite_open ("my_database.db" );
if (! $db ) exit("Невозможно создать базу данных!" );
// Создадим таблицу "table1" в базе
$query_table = sqlite_query ($db , "CREATE TABLE table1
(id INTEGER PRIMARY KEY,
/* id автоматически станет автоинкрементным */
field1 TEXT,
field2 TEXT);
"
);
if (! $query_table ) exit("Невозможно создать таблицу в базе данных!" );
// Запишем что-нибудь в таблицу
sqlite_query ($db , "INSERT INTO table1(field1, field2) VALUES ("PHP5+", "Apache");" );
sqlite_query ($db , "INSERT INTO table1(field1, field2) VALUES ("SQLite – ", "классная вещь");" );
sqlite_query ($db , "INSERT INTO table1(field1, field2) VALUES ("Посетите ", "sqlite.org");" );
// Удалим поле с id=2
sqlite_query ($db , "DELETE FROM table1 WHERE id=2;" );
// Сделаем выборку данных
$query = sqlite_query ($db , "SELECT * FROM table1;" );
// В цикле выведем все полученные данные
while ($array = sqlite_fetch_array ($query ))
{
echo($array [ "field1" ]. $array [ "field2" ]. " (id записи:" . $array [ "id" ]. ")
" );
}
?>

Это библиотека, написанная на языке C, которая обеспечивает работу с SQL. Данный инструмент относится к Реляционным системам управления базами данных . Большинство баз данных SQL работает по схеме клиент/сервер. Возьмём к примеру MySQL . В процессе работы данные берутся с MySQL сервера, и отправляются в качестве ответа на запрос. В случае использования SQLite, данные будут браться непосредственно с диска, т.е. не будет необходимости обращаться к серверу.

Установка

Мы будем взаимодействовать с базой данных через интерфейс командной строки sqlite3 (CLI) в Linux. Работа с sqlite3 CLI в MAC OS и Windows осуществляется таким же образом, однако я рекомендую вам потратить 5 минут на установку виртуальной машины, чтобы не захламлять свой компьютер лишним софтом.

Для установки sqlite3 на Linux выполняем команду:

sudo apt-get install sqlite3 libsqlite3-dev

В результате на вашей машине будет установлен sqlite3 . Для установки данного инструмента на других ОС следуйте инструкциям . Для запуска sqlite выполняем команду sqlite3 в консоли. Результат должен быть таким:

Во второй строчке указана подсказка о том, что для получения справки необходимо выполнить команду.help . Давайте сделаем это. В результате мы увидим Мета Команды и их описание.

Мета Команды

Мета Команды - предназначены для формирования таблиц и других административных операций. Все они оканчиваются точкой . Пройдёмся по списку команд, которые могут пригодиться:

Стандартные команды

Теперь давайте пройдёмся по списку стандартных команд sqlite3, которые предназначены для взаимодействия с базой данных. Стандартные команды могут быть классифицированы по трём группам:

  • Язык описания данных DDL : команды для создания таблицы, изменения и удаления баз данных, таблиц и прочего.
  • Язык управления данными DML : позволяют пользователю манипулировать данными (добавлять/изменять/удалять).
  • Язык запросов DQL : позволяет осуществлять выборку данных.
  • Заметка : SQLite так же поддерживает и множество других команд, список которых можно найти . Поскольку данный урок предназначен для начинающих, мы ограничимся перечисленным набором команд.

    Файлы баз данных SQLite являются кроссплатформенными . Они могут располагаться на различного рода устройствах.

    • Email
    • Комментарий

    Из всех этих полей только адрес сайта может быть пустым. Так же можем ввести колонку для нумерации комментриев. Назовём её post_id .

    Теперь давайте определимся с типами данных для каждой из колонок:

    Атрибут Тип данных
    post_id INTEGER
    name TEXT
    email TEXT
    website_url TEXT
    comment TEXT

    Вы сможете найти все типы данных, поддерживаемые в SQLite3.

    Так же следует отметить, в SQLite3 данные, вставляемые в колонку могут отличаться от указанного типа. В MySQL такое не пройдёт.

    Теперь давайте создадим базу данных. Если вы ещё находитесь в интерфейсе sqlite3, то наберите команду.quit для выхода. Теперь вводим:

    sqlite3 comment_section.db

    В результате, в текущем каталоге у нас появится файл comment_section.db .

    Заметка : если не указать название файла, sqlite3 создаст временную базу данных.

    Создание таблицы

    Для хранения комментариев нам необходимо создать таблицу. Назовём её comments . Выполняем команду:

    CREATE TABLE comments (post_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL, website_url TEXT NULL, comment TEXT NOT NULL);

    NOT NULL обеспечит уверенность, что ячейка не будет содержать пустое значение. PRIMARY KEY и AUTOINCREMENT расширяют возможности поля post_id .

    Чтобы убедиться в том, что таблица была создана, выполняем мета команду.tables . В результате видим нашу таблицу comments .

    Заметка : Для получения структуры таблицы наберите.schema comments

    Теперь можем внести данные в таблицу.

    ВСТАВКА СТРОК

    Предположим, что нам необходим внести следующую запись:

    Name: Shivam Mamgain Email: [email protected] Website: shivammg.blogspot.com Comment: Great tutorial for beginners.

    Для вставки воспользуемся командой INSERT .

    INSERT INTO comments (name, email, website_url, comment) VALUES ("Shivam Mamgain", "[email protected]", "shivammg.blogspot.com", "Great tutorial for beginners.");

    Указывать значение для post_id не нужно т.к. оно сформируется автоматически благодаря настройке AUTOINCREMENT .

    Чтобы набить руку можете вставить ещё несколько строк.

    ВЫБОРКА

    Для выборки данных воспользуемся командой SELECT .

    SELECT post_id, name, email, website_url, comment FROM comments;

    Этот же запрос может выглядеть так:

    SELECT * FROM comments;

    В результате из таблицы будут извлечены все строки. Результат может выглядеть без разграничения по колонкам и без заголовка. Чтобы это исправить выполняем:

    Для отображения шапки введите.headers ON .

    Для отображения колонок выполните команду.mode column .

    Выполняем SELECT запрос ещё раз.

    Заметка : вид отображения можно изменить, воспользовавшись мета командой.mode .

    ОБНОВЛЕНИЕ

    Предположим, что поле email для пользователя ‘Shivam Mamgain’ необходимо изменить на ‘[email protected]’. Выполняем следующую команду:

    В результате запись будет изменена.

    Заметка : Значение в колонке name может быть не уникально, так что в результате работы команды может быть затронуто более одной строки. Для всех пользователей, где значение name = ‘Shivam Mamgain’, поле email будет изменено на ‘[email protected]’. Для изменения какой-то конкретной строки следует её отследить по полю post_id . Мы его определили как PRIMARY KEY , что обеспечивает уникальность значения.

  • SQLite ,
  • Разработка веб-сайтов
  • Решил все-таки написать статью про SQLite, в которой хочу обобщить свой 3-х летний опыт использования этой БД под Windows. Вижу, что тема популярная, но информации мало.

    Небольшая вводная.

    Эта статья не для начинающих программистов.
    Она не является учебником по SQL.
    Она не агитирует использовать SQLite.
    Она не агитирует не использовать SQLite.
    Статья написана в виде вопросов от гипотетического новичка в SQLite и ответов на них (поскольку информации очень много и так хоть немного проще ее структурировать).

    Что такое SQLite?
    SQLite - это встраиваемая кроссплатформенная БД, которая поддерживает достаточно полный набор команд SQL и доступна в исходных кодах (на языке C).

    Исходные коды SQLite находятся в public domain, то есть вообще никаких ограничений на использование.

    Сайт (с прекрасной документацией на английском): http://sqlite.org

    Текущая версия: 3.7.13

    SQLite можно скомпилировать самому, но я скачиваю ее уже скомпилированную в виде Windows DLL.

    Для собственной сборки обычно скачивают т.н. «amalgamation» ,
    т.е. исходники SQLite в виде единого файла на языке C + sqlite3.h.

    Чтобы уменьшить размер кода SQlite, выкинув ненужные ништяки, используются всякие DEFINE.

    Насколько SQLite популярна?
    Кратко: она везде. Как минимум, на любом смартфоне.
    Насколько она надежна?
    Очень. При выпуске версии она проходит через ряд серьезнейших автоматических тестов (проводится ~ 2 млн тестов), покрытие кода тестами 100% (с августа 2009).
    А какие еще инструменты дают разработчики?
    Доступна консольная утилита для работы с базами (sqlite3.exe, «a command-line shell for accessing and modifying SQLite databases»).
    И все?
    Да, от основных разработчиков - все. Однако, другие люди пишут всякие менеджеры и пр.
    Лично я так и не нашел идеального и пользуюсь консолью.
    Что значит «достаточно полный набор SQL»?
    Как известно, в своем развитии SQL устремился в разные стороны. Крупные производители начали впихивать всякие расширения. И хотя принимаются всякие стандарты (SQL 92), в реальной жизни все крупные БД не поддерживают стандартов полностью + имеют что-то свое. Так вот, SQLite старается жить по принципу «минимальный, но полный набор». Она не поддерживает сложные штуки, но во многом соответствует SQL 92.
    И вводит некие свои особенности, которые очень удобны, но - не стандартны.
    Что конкретно в поддержке SQL может вызвать недоумение?
    Нельзя удалить или изменить столбец в таблице (ALTER TABLE DROP COLUMN…, ALTER TABLE ALTER COLUMN…).
    Есть триггеры, но не настолько мощные как у крупных RDBMS.
    Есть поддержка foreign key, но по умолчанию - она ОТКЛЮЧЕНА.
    Нет встроенной поддержки UNICODE (но ее, вообщем, нетрудно добиться).
    Нет хранимых процедур.
    А что своего хорошего или необычного?
    a) каждая запись содержит виртуальный столбец rowid, который равен 64-битному номеру (уникальному для таблицы).
    Можно объявить свой столбец INTEGER PRIMARY KEY и тогда этот столбец станет rowid (со своим именем, имя rowid все равно работает).
    При вставке записи можно указать rowid, а можно - не указывать (и система тогда вставит уникальный).
    Подробности: www.sqlite.org/autoinc.html
    b) можно без труда организовать БД в памяти (это очень удобно и чуть позже расскажу подробнее);
    c) легко переносить: по умолчанию, БД - это один файл (в кроссплатформенном формате);
    d) тип столбца не определяет тип хранимого значения в этом поле записи, то есть в любой столбец можно занести любое значение;
    e) много встроенных функций (которые можно использовать в SQL): www.sqlite.org/lang_corefunc.html;
    Не понял - что там с типом? Зачем нужен тип столбца тогда вообще?
    Тип столбца определяет как сравнивать значения (нужно же их привести к единому типу при сравнении, скажем, внутри индекса).
    Но не обязывает заносить значения именно такого типа в столбец. Нечто вроде weak typing.

    Допустим, мы объявили столбец как «A INTEGER».
    SQlite позволяет занести в этот столбец значения любого типа (999, «abc», «123», 678.525).
    Если вставляемое значение - не целое, то SQlite пытается привести его к целому.
    Т.е. строка «123» превратится в целое 123, а остальные значения запишутся «как есть».

    Так можно вообще не задавать тип столбца?
    Очень часто так и делается: CREATE TABLE foo (a,b,c,d) .
    А как с архитектурой? Сервера-то нету?
    Сервера нету, само приложение является сервером. Доступ к БД происходит через «подключения» к БД (нечто вроде хэндла файла ОС), которые мы открываем через вызов соот-й функции DLL. При открытии указывается имя файла БД. Если такого нету - он автоматически создается.
    Допустимо открывать множество подключений к одной и тоже БД (через имя файла) в одном или разных приложениях.
    Система использует механизмы блокировки доступа к файлу на уровне ОС, чтобы это все работало
    (эти механизмы обычно плохо работают на сетевых дисках, так что не рекомендуется использовать SQlite с файлом на сети).
    Изначально SQlite работал по принципу «многие читают - один пишет».
    То есть только одно соединение пишет в БД в данный момент времени. Если другие соединения попробуют тоже записать, то словят ошибку SQLITE_BUSY.
    Можно, однако, ввести таймаут операций. Тогда подключение, столкнувшись с занятостью БД, будет ждать N секунду прежде, чем отвалиться с ошибкой SQLITE_BUSY.
    И как быть?
    Либо одно подключение и все запросы через него, либо исходить из возможного таймаута и предусмотреть повтор выполнения SQL.
    Есть и еще одна возможность: не так давно появился новый вид лога SQlite: Write Ahead Log, WAL .
    Если включить для БД именно этот режим лога, то несколько подключений смогут одновременно модифицировать БД.
    Но в этом режиме БД уже занимает несколько файлов.
    Ну понятно теперь почему SQLite - ужасна, ведь у нее нет ГЛОБАЛЬНОГО КЭША?
    Действительно, все современные RDBMS немыслимы без глобального разделяемого кэша, который может хранить всякие ништяки вроде скомпилированных параметризованных запросов. Этим занят сервер, которого тут нет. Однако, в рамках одного приложения SQlite может разделять кэш между несколькими подключениями (читать тут: www.sqlite.org/sharedcache.html) и немного сэкономить память.
    А почему все жалуются, что SQLite - тормозит?
    Две причины. Первая - настройки по умолчанию. Они работают на надежность, а не на производительность.
    Вторая - непонимание механизма фиксации транзакций. По умолчанию после любой команды SQlite будет фиксировать транзакцию (то есть ожидать пока БД окажется в целостном состоянии для отключения питания). В зависимости от режима паранойи SQLite потратит на это от 50 до 300 мс (ожидая окончания записи данных на диск).
    Что делать-то? Мне нужно вставить 100 тыс записей и быстро!
    Удалить индексы, включить режим синхронизации OFF (или NORMAL), вставлять порциями по N тысяч (N - подобрать, для начала взять 5000). Перед вставкой порции сделать BEGIN TRANSACTION, после - COMMIT.
    А вот я нашел ошибку! Как рапортовать?
    Никак.

    Дело в том, что популярность SQLite страшна - она везде. Это не шутка.
    И разработчики столкнулись с валом сообщений об ошибках, которые либо были вызваны непониманием, либо являлись скрытым feature request. Они, фактически, закрыли прямой прием репортов с ошибками.
    Так что следует подписаться на список рассылки и описать там проблему и надеятся на лучшее.

    Лично у меня возникла ситуация, которую я трактовал как дефект SQLIte. Я описал это в рассылке. В следующей версии поведение SQLite было исправлено.

    Удобная утилита , чтобы поиграться с SQLite.

    Продолжение следует.

    Теги:

    • sqlite
    • sql
    • rdbms
    • базы данных
    Добавить метки