sqlite — вопросы с ответами

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 (от выбора и обновления строк до создания таблиц, представлений и индексов) сначала компилируется в этот язык виртуальной машины, образуя автономный набор инструкций, который определяет, как выполнять данную команду.

13 ответов
Как следует из названия, я хотел бы выбрать первую строку каждого набора строк, сгруппированных с помощью GROUP BY. В частности, если у меня есть таблица purchases, которая выглядит так: SELECT * FROM purchases; Мой вывод: id | customer | total ---+----------+------ 1 | Joe | 5 2 | Sally ...
group-by
greatest-n-per-group
27 сен. 2010, в 01:33
5 ответов
Я только начинаю изучать SQLite. Было бы неплохо видеть детали таблицы, например MySQL DESCRIBE [table]. PRAGMA table_info [table] недостаточно хорош, так как он имеет только базовую информацию (например, он не показывает, является ли столбец каким-то полем или нет). Есть ли у SQLite способ сделать ...
sqlite3
25 июль 2010, в 19:05
10 ответов
Что было бы лучше всего использовать при выполнении запросов в базе данных SQLite в приложении Android? Безопасно ли запускать вставки, удалять и выбирать запросы из AsyncTask doInBackground? Или я должен использовать поток пользовательского интерфейса? Я полагаю, что запросы к базе данных могут быт...
database
sqlite3
22 март 2010, в 15:17
16 ответов
У меня есть проект, в котором я хотел бы использовать некоторые из возможностей .NET 4.0, но основным требованием является то, что я могу использовать фреймворк System.Data.SQLite, который скомпилирован против 2.X. Я вижу упоминание об этом возможном, например принятом ответе здесь, но я не вижу, ка...
.net-4.0
system.data.sqlite
16 март 2010, в 16:09
10 ответов
Оптимизация SQLite сложна. Производительность вложений в C-приложение может варьироваться от 85 вставок в секунду до более чем 96 000 вставок в секунду! Фон: Мы используем SQLite как часть настольного приложения. У нас есть большое количество данных конфигурации, хранящихся в XML файлах, которые а...
optimization
performance
10 нояб. 2009, в 20:29
24 ответа
В MySQL вы можете вставить несколько строк следующим образом: INSERT INTO 'tablename' ('column1', 'column2') VALUES ('data1', 'data2'), ('data1', 'data2'), ('data1', 'data2'), ('data1', 'data2'); Тем не менее, я получаю сообщение об ошибке, когда пытаюсь сделать что-то подобное. Мож...
syntax
22 окт. 2009, в 21:58
20 ответов
Как я могу надежно проверять SQLite, существует ли конкретная таблица пользователей? Я не прошу о ненадежных способах проверки, если "select *" в таблице возвратил ошибку или нет (это даже хорошая идея?). Причина такова: В моей программе мне нужно создать, а затем заполнить некоторые таблицы, если ...
21 окт. 2009, в 16:05
20 ответов
Я пытаюсь запустить приложение Django на моем VPS Debian 5. Когда я запускаю демонстрационное приложение, оно возвращается с этой ошибкой: File "/usr/local/lib/python2.5/site-packages/django/utils/importlib.py", line 35, in import_module __import__(name) File "/usr/local/lib/python2.5/s...
31 июль 2009, в 03:38
9 ответов
Каков синтаксис для указания первичного ключа на более чем 1 столбце в SQLITE?
primary-key
ddl
composite-primary-key
09 апр. 2009, в 15:45
4 ответа
Я уже хорошо знаком с реляционными базами данных и использовал SQLite (и другие базы данных) в прошлом. Однако Core Data имеет определенное очарование, поэтому я рассматриваю возможность потратить некоторое время, чтобы изучить его для использования в моем следующем приложении. Есть ли большая польз...
sqlite3
core-data
cocoa
osx
07 фев. 2009, в 08:13
15 ответов
http://en.wikipedia.org/wiki/Upsert Вставить обновление хранимой процедуры на SQL Server Есть ли какой-нибудь умный способ сделать это в SQLite, о котором я не думал? В принципе, я хочу обновить три из четырех столбцов, если запись существует, Если он не существует, я хочу ВСТАВИТЬ запись со значе...
upsert
07 янв. 2009, в 02:14
17 ответов
Какой SQL можно использовать для отображения таблиц и строк в этих таблицах в файле базы данных SQLite - как только я присоединю его с помощью команды ATTACH в инструменте командной строки SQLite 3?
database
sqlite3
metadata
17 сен. 2008, в 12:00
10 ответов
Меня привлекает аккуратность, которую предоставляет одна база данных. В какой библиотеке драйвера/соединителя есть подключение и использование SQLite с Java. Я обнаружил библиотеку обертки, http://www.ch-werner.de/javasqlite, но есть ли другие более известные проекты?...
03 сен. 2008, в 06:14
25 ответов
Кто-нибудь знает быстрый простой способ переноса базы данных SQLite3 в MySQL?
migration
20 авг. 2008, в 19:29
Наверх
Меню