SQLite – это встраиваемая реляционная база данных с открытым исходным кодом. Первоначально выпущенная в 2000 году, она предназначена для предоставления приложениям удобного способа управления данными без дополнительных затрат, что часто обеспечивается специальными системами управления реляционными базами данных. SQLite имеет заслуженную репутацию очень портативного, простого в использовании, компактного, эффективного и надежного программного обеспечения.
Встраиваемая СУБД
SQLite – это встраиваемая база данных. Вместо того, чтобы работать независимо как самостоятельный процесс, она симбиотически сосуществует внутри приложения, которое она обслуживает, – внутри своего пространства процессов. Ее код переплетается или внедряется как часть программы, в которой она находится. Для стороннего наблюдателя никогда не будет очевидно, что такая программа имеет встроенную систему управления реляционными базами данных (RDBMS). Программа просто выполняет свою работу и каким-то образом управляет своими данными, не обращая внимания на то, как это происходит. Но внутри работает полноценный, автономный движок базы данных.
Одним из преимуществ наличия сервера базы данных в вашей программе является то, что не требуется настройка сети или администрирование. Подумайте о том, как это удобно: не нужно беспокоиться о брандмауэрах или разрешении адресов, не приходится тратить время на управление сложными разрешениями и привилегиями. И клиент, и сервер работают вместе в одном процессе. Это снижает накладные расходы, связанные с сетевыми вызовами, упрощает администрирование базы данных и упрощает развертывание приложения. Все, что вам нужно, скомпилировано прямо в вашу программу.
Рассмотрим процессы, показанные на рисунке выше. Один из них – это скрипт на Perl, другой – стандартная программа на C/C++, а последний – это PHP-скрипт, размещенный на Apache. Все это с использованием SQLite. Сценарий Perl импортирует модуль DBI::SQLite, который, в свою очередь, связан с API-интерфейсом SQLite C, добавляя библиотеку SQLite. Библиотека PHP работает аналогично программе C++. В конечном итоге все три процесса взаимодействуют с API-интерфейсом SQLite C. Таким образом, все три имеют встроенный SQLite в пространствах своих процессов. Так что получается, что каждый из этих процессов не только запускает свой собственный соответствующий код, но и сам становится независимым сервером баз данных. Более того, даже если каждый процесс представляет собой независимый сервер, он все равно может работать с одним и тем же файлом (файлами) базы данных, получая выгоду от использования операционной системы SQLite для управления синхронизацией и блокировкой.
База данных для разработчиков
SQLite довольно универсален. Это база данных, библиотека программирования и инструмент командной строки, а также отличный инструмент обучения, который обеспечивает хорошее введение в реляционные базы данных. Есть множество способов его использования: во встроенных средах, веб-сайтах, сервисах операционной системы, сценариях и приложениях. Для программистов SQLite – это как «лента данных», обеспечивающая простой способ привязки приложений и их данных. Как и клейкая лента, нет конца ее потенциальному использованию. В веб-среде SQLite может помочь в управлении сложной информацией о сеансе. Вместо того, чтобы сериализовать данные сеанса в один большой двоичный объект, отдельные фрагменты можно выборочно записывать и считывать из отдельных баз данных сеансов. SQLite также служит хорошей резервной реляционной базой данных для разработки и тестирования: здесь нет внешних СУБД или сетей для настройки, а также имен пользователей и паролей, которые мешают сосредоточиться на программировании. SQLite также может служить кешем, хранить данные конфигурации или, используя свою двоичную совместимость на разных платформах, даже работать как формат файла приложения.
Помимо того, что SQLite является просто хранилищем памяти, он может служить чисто функциональным инструментом для общей обработки данных. В зависимости от размера и сложности, может быть легче представить некоторые структуры данных приложения в виде таблицы или таблиц в базе данных в памяти. С таким большим количеством разработчиков, аналитиков и других, знакомых с реляционными базами данных и SQL, вы можете извлечь выгоду из «предполагаемых знаний» – оперируя данными с помощью реляционного SQLite, вместо того чтобы писать свои собственные алгоритмы для манипулирования и сортировки структуры данных. Если вы программист, представьте, сколько кода потребуется для реализации следующего оператора SQL в вашей программе:
Если вы уже знакомы с SQL, представьте себе кодирование эквивалента подзапроса, составного запроса, предложения GROUP BY или многогранного соединения на вашем любимом (или не очень любимом) языке программирования. SQLite встраивает все эти функции в ваше приложение с минимальными затратами. С ядром базы данных, интегрированным непосредственно в ваш код, вы можете начать думать о SQL как о механизме разгрузки для реализации сложных алгоритмов сортировки в вашей программе. Этот подход становится более привлекательным по мере роста размера вашего набора данных или по мере усложнения ваших алгоритмов. Более того, SQLite можно настроить на использование фиксированного объема ОЗУ, а затем выгружать данные на диск, если он превышает указанный лимит. Это еще сложнее сделать, если вы пишете свои собственные алгоритмы. В SQLite эта функция доступна при простом вызове одной команды SQL.
SQLite также является отличным учебным пособием для программистов – рог изобилия для изучения компьютерных дисциплин. От генераторов синтаксических анализаторов до токенизаторов, виртуальных машин, алгоритмов B-tree, кэширования, программной архитектуры и многого другого – это фантастический инструмент для изучения многих устоявшихся концепций информатики. Его модульность, небольшой размер и простота позволяют легко представить каждую тему как отдельное тематическое исследование, за которым может легко следовать любой человек.
SQL в SQLite
SQL является огромным компонентом любого обсуждения баз данных, и SQLite ничем от остальных не отличается. SQL является единственным (и почти универсальным) средством связи с реляционной базой данных. Это рабочая лошадка, посвященная обработке информации. Он предназначен для структурирования, чтения, записи, сортировки, фильтрации, защиты, расчета, генерации, группировки, агрегирования и общего управления информацией.
SQL – это интуитивно понятный и удобный язык. Одна из забавных вещей в SQL заключается в том, что независимо от того, являетесь ли вы экспертом или новичком, кажется, что вы всегда сможете продолжать изучать новые способы ведения дел.
Команды
SQL состоит из команд. Команды обычно заканчиваются точкой с запятой, которая обозначает конец команды. Например, ниже приведены три различные команды:
Команды, в свою очередь, состоят из серии токенов. Токенами могут быть литералы, ключевые слова, идентификаторы, выражения или специальные символы. Токены разделены пробелами, такими как обычные пробелы, табуляции и переходы строк.
Литералы
Литералы, также называемые константами, обозначают явные значения. Существует три вида литералов: строковые, числовые и двоичные литералы. Строковые литералы – это один или несколько буквенно-цифровых символов, заключенных в одинарные кавычки. Вот некоторые примеры:
Хотя SQLite поддерживает разделение строковых значений одинарными или двойными кавычками, мы настоятельно рекомендуем использовать только одинарные кавычки. Это стандарт SQL, и он сэкономит вам много времени, если вы столкнетесь с системой, которая строго соблюдает это. Если одинарные кавычки являются частью строкового значения, они должны быть представлены в виде двух последовательных одинарных кавычек. Например, курица Кенни будет выражаться следующим образом:
Числовые литералы представлены в целых, десятичных или научных обозначениях. Вот некоторые примеры:
Двоичные значения представлены с использованием обозначения x'0000 ', где каждая цифра является шестнадцатеричным значением. Двоичные значения должны быть выражены в виде кратных 2 шестнадцатеричных значений (8 бит). Вот некоторые примеры:
Компилятор
Процесс компиляции начинается с токенизатора и парсера. Они работают вместе, чтобы взять оператор языка структурированных запросов (SQL) в текстовом виде, проверить его синтаксис, а затем преобразовать его в иерархическую структуру данных, которой более легко управлять нижними уровнями. Токенайзер SQLite закодирован вручную. Его синтаксический анализатор генерируется специальным генератором синтаксического анализатора SQLite, который называется Lemon. Генератор синтаксического анализатора Lemon разработан для высокой производительности и принимает специальные меры предосторожности для защиты от утечек памяти. Как только оператор разбит на токены, оценен и преобразован в виде дерева синтаксического разбора, парсер передает дерево вниз генератору кода.
Генератор кода переводит дерево разбора в своего рода язык ассемблера, специфичный для SQLite. Этот язык ассемблера состоит из инструкций, которые исполняются его виртуальной машиной. Единственная задача генератора кода – преобразовать дерево разбора в законченную мини-программу, написанную на этом языке ассемблера, и передать его на обработку на виртуальную машину.
Виртуальная машина
В центре стека находится виртуальная машина, также называемая механизмом виртуальной базы данных (VDBE). VDBE – это виртуальная машина на основе регистров, которая работает с байтовым кодом, что делает ее независимой от базовой операционной системы, процессора или архитектуры системы. Байт-код VDBE (или язык виртуальной машины) состоит из более чем 100 возможных задач, известных как коды операций, которые сосредоточены на операциях с базой данных. VDBE разработан специально для обработки данных. Каждая инструкция в своем наборе инструкций либо выполняет определенную операцию базы данных (например, открывает курсор на таблице, делает запись, извлекает столбец или начинает транзакцию), либо выполняет манипуляции для подготовки к такой операции. В целом в правильном порядке, набор команд VDBE может удовлетворять любой команде SQL, какой бы сложной она ни была. Каждый оператор SQL в SQLite (от выбора и обновления строк до создания таблиц, представлений и индексов) сначала компилируется в этот язык виртуальной машины, образуя автономный набор инструкций, который определяет, как выполнять данную команду.