SQLite
Тип |
---|
SQLite (/ˌɛskjuːɛlˈlaɪt/ или /ˈsiːkwəl.laɪt/) — компактная встраиваемая реляционная база данных. Исходный код библиотеки передан в общественное достояние. В 2005 году проект получил награду Google-O’Reilly Open Source Awards[1].
Дизайн
Слово «встраиваемый» (embedded) означает, что SQLite не использует парадигму клиент-сервер, то есть движок SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а предоставляет библиотеку, с которой программа компонуется и движок становится составной частью программы. Таким образом, в качестве протокола обмена используются вызовы функций (API) библиотеки SQLite. Такой подход уменьшает накладные расходы, время отклика и упрощает программу. SQLite хранит всю базу данных (включая определения, таблицы, индексы и данные) в единственном стандартном файле на том компьютере, на котором исполняется программа. Простота реализации достигается за счёт того, что перед началом исполнения транзакции записи весь файл, хранящий базу данных, блокируется; ACID-функции достигаются в том числе за счёт создания файла журнала.
Несколько процессов или потоков могут одновременно без каких-либо проблем читать данные из одной базы. Запись в базу можно осуществить только в том случае, если никаких других запросов в данный момент не обслуживается; в противном случае попытка записи оканчивается неудачей, и в программу возвращается код ошибки. Другим вариантом развития событий является автоматическое повторение попыток записи в течение заданного интервала времени.
В комплекте поставки идёт также функциональная клиентская часть в виде исполняемого файла sqlite3, с помощью которого демонстрируется реализация функций основной библиотеки. Клиентская часть работает из командной строки, позволяет обращаться к файлу БД на основе типовых функций ОС.
Благодаря архитектуре движка возможно использовать SQLite как на встраиваемых системах, так и на выделенных машинах с гигабайтными массивами данных.
Типы данных
SQLite поддерживает динамическое типизирование данных. Возможные типы полей: INTEGER, REAL, TEXT, BLOB.
Ограничения
Старые версии SQLite были спроектированы без каких-либо ограничений, единственным условием было то, чтобы база данных умещалась в памяти, в которой все вычисления производились при помощи 32-разрядных целых чисел. Это создавало определённые проблемы. Из-за того, что верхние пределы не были определены и соответственно должным образом протестированы, часто обнаруживались ошибки при использовании SQLite в достаточно экстремальных условиях. Поэтому в новых версиях SQLite были введены пределы, которые теперь проверяются вместе с общим набором тестов.
Во время компиляции библиотеки SQLite устанавливаются следующие ограничения, которые можно, при острой необходимости, увеличивать:
Описание | Значение | Константа в исходнике |
---|---|---|
Максимальная длина строки или BLOB-поля | 1 000 000 000 | SQLITE_MAX_LENGTH |
Максимальное количество колонок | 2 000 | SQLITE_MAX_COLUMN |
Максимальная длина SQL-выражения | 1 000 000 | SQLITE_MAX_SQL_LENGTH |
Максимальное количество таблиц в выражениях с JOIN | 64 | |
Максимальная глубина дерева выражений | 1 000 | SQLITE_MAX_EXPR_DEPTH |
Максимальное количество аргументов функции | 100 | SQLITE_MAX_FUNCTION_ARG |
Максимальное количество термов в объединённом выражении с SELECT | 500 | SQLITE_MAX_COMPOUND_SELECT |
Максимальная длина шаблона как аргумента операторов LIKE или GLOB | 50 000 | SQLITE_MAX_LIKE_PATTERN_LENGTH |
Максимальное количество символов-заменителей в одном SQL-выражении | 999 | SQLITE_MAX_VARIABLE_NUMBER |
Максимальная глубина рекурсии триггеров | 1 000 | SQLITE_MAX_TRIGGER_DEPTH |
Максимальное количество присоединённых баз | 10 | SQLITE_MAX_ATTACHED |
Максимальный размер страницы базы данных | 32 768 | SQLITE_MAX_PAGE_SIZE |
Максимальное количество страниц в файле базы данных | 1 073 741 823 | SQLITE_MAX_PAGE_COUNT |
На текущий момент только значение SQLITE_MAX_PAGE_SIZE не может быть больше заданного по умолчанию. Таким образом, не изменяя SQLITE_MAX_PAGE_COUNT, можно сказать, что максимальный размер файла базы данных составляет примерно 32 ТБ (35’184’372’056’064 Б).
Некоторые ограничения можно менять в сторону уменьшения во время исполнения программы при помощи задания категории и соответствующего значения функции sqlite3_limit():
int sqlite3_limit(sqlite3*, int id, int newVal)
Категория | Описание |
---|---|
SQLITE_LIMIT_LENGTH | Максимальная длина любой строки или BLOB-поля или ряда |
SQLITE_LIMIT_SQL_LENGTH | Максимальная длина SQL-выражения |
SQLITE_LIMIT_COLUMN | Максимальное количество колонок в определении таблицы или результате выборки, или индексе, или выражениях с операторами ORDER BY или GROUP BY |
SQLITE_LIMIT_EXPR_DEPTH | Максимальная глубина разобранного дерева любого выражения |
SQLITE_LIMIT_COMPOUND_SELECT | Максимальное количество термов в объединённом выражении с SELECT |
SQLITE_LIMIT_VDBE_OP | Максимальное количество инструкций программы виртуальной машины выполняемого SQL-выражения |
SQLITE_LIMIT_FUNCTION_ARG | Максимально количество аргументов функции |
SQLITE_LIMIT_ATTACHED | Максимальное количество присоединённых баз |
SQLITE_LIMIT_LIKE_PATTERN_LENGTH | Максимальная длина шаблона как аргумента операторов LIKE или GLOB |
SQLITE_LIMIT_VARIABLE_NUMBER | Максимальное количество переменных в SQL-выражении, которые можно связать |
SQLITE_LIMIT_TRIGGER_DEPTH | Максимальная глубина рекурсии триггеров |
Это может быть полезным, если SQLite используется в веб-приложениях, так как уменьшенные пределы могут предотвратить DoS-атаки со стороны недоверяемых внешних клиентов.
Использование
Сама библиотека SQLite написана на C; существует большое количество привязок к другим языкам программирования, в том числе Delphi, C++, Java, C#, VB.NET, Python, Perl, Node.js, PHP, PureBasic[2], Tcl (средства для работы с Tcl включены в комплект поставки SQLite), Ruby, Haskell, Scheme, Smalltalk, Lua и Parser, а также ко многим другим. Полный список существующих средств размещён на странице проекта[3].
Простота и удобство встраивания SQLite привели к тому, что библиотека используется в браузерах, музыкальных плеерах и многих других программах.
В частности, SQLite используют:
- Adobe Integrated Runtime — среда для запуска приложений (частично);
- Gears;
- Autoit;
- Фреймворк Qt;
- Фреймворк Yii;[4] (имеется в наличии)
- Платформа XUL на движке Gecko 1.9+, XULRunner 1.9+ и, потенциально, все приложения, основанные на этой платформе, в том числе:
- Mozilla Firefox (начиная с версии 3.0)
- Mozilla Thunderbird (начиная с версии 3.0)
- Songbird
- SQLite Manager[5].
- Skype[6];
- Некоторые модели GPS-навигаторов Garmin
- Android API
- Minetest
Многие программы поддерживают SQLite в качестве формата хранения данных (особенно в Mac OS и iOS, Android), в том числе:
- 1С:Предприятие 7.7 (с помощью внешнего компонента[7]);
- 1С:Предприятие 8.3 (для хранения записей журнала регистрации[8]);
- Adobe Photoshop Lightroom;
- FlylinkDC++;
- AIMP;
- Banshee;
- Calibre;
- Eserv;
- F-Spot;
- FAR Manager (начиная с версии 3.0);
- Daminion;
- Gajim;
- Google Chrome;
- Miranda IM (с помощью плагина драйвера базы данных[9]);
- Money IQ;
- Opera (начиная с версии 10.50);
- qutIM;
- Safari;
- XnView;
- Garena.
См. также
Напишите отзыв о статье "SQLite"
Ссылки
- [www.sqlite.org/ Официальный сайт] (англ.)
- [www.sqlite.org/cvstrac/wiki?p=ManagementTools Список программ для администрирования SQLite] (англ.)
- [sites.google.com/site/javatokens/sqlite Самоучитель SQLite]
Примечания
- ↑ [code.google.com/opensource/osa-hall-of-fame.html Google-O’Reilly Open Source Awards — Hall of Fame — Google Code]
- ↑ [purebasic.com/documentation/database/usesqlitedatabase.html Функция UseSQLiteDatabase()]
- ↑ [www.sqlite.org/cvstrac/wiki?p=SqliteWrappers Список привязок SQLite для других языков]
- ↑ [www.yiiframework.ru/doc/guide/ru/quickstart.first-app Создание первого приложения - Полное руководство по Yii - YiiFramework.ru]. www.yiiframework.ru. Проверено 7 марта 2016.
- ↑ [code.google.com/p/sqlite-manager/ sqlite-manager — Project Hosting on Google Code]
- ↑ [www.mail-archive.com/sqlite-users%40sqlite.org/msg27326.html Skype client using SQLite?]
- ↑ [code.google.com/p/sqlite1c/ sqlite1c — Project Hosting on Google Code]
- ↑ [v8.1c.ru/o7/201310log/index.htm Как мы улучшили журнал регистрации]. 1С (29.10.2013).
- ↑ [addons.miranda-im.org/details.php?action=viewfile&id=3535 dbRW Database Driver 1.2]
|
|
Отрывок, характеризующий SQLite
Назвали полковника, князя Репнина.– Вы командир кавалергардского полка императора Александра? – спросил Наполеон.
– Я командовал эскадроном, – отвечал Репнин.
– Ваш полк честно исполнил долг свой, – сказал Наполеон.
– Похвала великого полководца есть лучшая награда cолдату, – сказал Репнин.
– С удовольствием отдаю ее вам, – сказал Наполеон. – Кто этот молодой человек подле вас?
Князь Репнин назвал поручика Сухтелена.
Посмотрев на него, Наполеон сказал, улыбаясь:
– II est venu bien jeune se frotter a nous. [Молод же явился он состязаться с нами.]
– Молодость не мешает быть храбрым, – проговорил обрывающимся голосом Сухтелен.
– Прекрасный ответ, – сказал Наполеон. – Молодой человек, вы далеко пойдете!
Князь Андрей, для полноты трофея пленников выставленный также вперед, на глаза императору, не мог не привлечь его внимания. Наполеон, видимо, вспомнил, что он видел его на поле и, обращаясь к нему, употребил то самое наименование молодого человека – jeune homme, под которым Болконский в первый раз отразился в его памяти.
– Et vous, jeune homme? Ну, а вы, молодой человек? – обратился он к нему, – как вы себя чувствуете, mon brave?
Несмотря на то, что за пять минут перед этим князь Андрей мог сказать несколько слов солдатам, переносившим его, он теперь, прямо устремив свои глаза на Наполеона, молчал… Ему так ничтожны казались в эту минуту все интересы, занимавшие Наполеона, так мелочен казался ему сам герой его, с этим мелким тщеславием и радостью победы, в сравнении с тем высоким, справедливым и добрым небом, которое он видел и понял, – что он не мог отвечать ему.
Да и всё казалось так бесполезно и ничтожно в сравнении с тем строгим и величественным строем мысли, который вызывали в нем ослабление сил от истекшей крови, страдание и близкое ожидание смерти. Глядя в глаза Наполеону, князь Андрей думал о ничтожности величия, о ничтожности жизни, которой никто не мог понять значения, и о еще большем ничтожестве смерти, смысл которой никто не мог понять и объяснить из живущих.
Император, не дождавшись ответа, отвернулся и, отъезжая, обратился к одному из начальников:
– Пусть позаботятся об этих господах и свезут их в мой бивуак; пускай мой доктор Ларрей осмотрит их раны. До свидания, князь Репнин, – и он, тронув лошадь, галопом поехал дальше.
На лице его было сиянье самодовольства и счастия.
Солдаты, принесшие князя Андрея и снявшие с него попавшийся им золотой образок, навешенный на брата княжною Марьею, увидав ласковость, с которою обращался император с пленными, поспешили возвратить образок.
Князь Андрей не видал, кто и как надел его опять, но на груди его сверх мундира вдруг очутился образок на мелкой золотой цепочке.
«Хорошо бы это было, – подумал князь Андрей, взглянув на этот образок, который с таким чувством и благоговением навесила на него сестра, – хорошо бы это было, ежели бы всё было так ясно и просто, как оно кажется княжне Марье. Как хорошо бы было знать, где искать помощи в этой жизни и чего ждать после нее, там, за гробом! Как бы счастлив и спокоен я был, ежели бы мог сказать теперь: Господи, помилуй меня!… Но кому я скажу это! Или сила – неопределенная, непостижимая, к которой я не только не могу обращаться, но которой не могу выразить словами, – великое всё или ничего, – говорил он сам себе, – или это тот Бог, который вот здесь зашит, в этой ладонке, княжной Марьей? Ничего, ничего нет верного, кроме ничтожества всего того, что мне понятно, и величия чего то непонятного, но важнейшего!»
Носилки тронулись. При каждом толчке он опять чувствовал невыносимую боль; лихорадочное состояние усилилось, и он начинал бредить. Те мечтания об отце, жене, сестре и будущем сыне и нежность, которую он испытывал в ночь накануне сражения, фигура маленького, ничтожного Наполеона и над всем этим высокое небо, составляли главное основание его горячечных представлений.
Тихая жизнь и спокойное семейное счастие в Лысых Горах представлялись ему. Он уже наслаждался этим счастием, когда вдруг являлся маленький Напoлеон с своим безучастным, ограниченным и счастливым от несчастия других взглядом, и начинались сомнения, муки, и только небо обещало успокоение. К утру все мечтания смешались и слились в хаос и мрак беспамятства и забвения, которые гораздо вероятнее, по мнению самого Ларрея, доктора Наполеона, должны были разрешиться смертью, чем выздоровлением.
– C'est un sujet nerveux et bilieux, – сказал Ларрей, – il n'en rechappera pas. [Это человек нервный и желчный, он не выздоровеет.]
Князь Андрей, в числе других безнадежных раненых, был сдан на попечение жителей.
В начале 1806 года Николай Ростов вернулся в отпуск. Денисов ехал тоже домой в Воронеж, и Ростов уговорил его ехать с собой до Москвы и остановиться у них в доме. На предпоследней станции, встретив товарища, Денисов выпил с ним три бутылки вина и подъезжая к Москве, несмотря на ухабы дороги, не просыпался, лежа на дне перекладных саней, подле Ростова, который, по мере приближения к Москве, приходил все более и более в нетерпение.
«Скоро ли? Скоро ли? О, эти несносные улицы, лавки, калачи, фонари, извозчики!» думал Ростов, когда уже они записали свои отпуски на заставе и въехали в Москву.
– Денисов, приехали! Спит! – говорил он, всем телом подаваясь вперед, как будто он этим положением надеялся ускорить движение саней. Денисов не откликался.
– Вот он угол перекресток, где Захар извозчик стоит; вот он и Захар, и всё та же лошадь. Вот и лавочка, где пряники покупали. Скоро ли? Ну!
– К какому дому то? – спросил ямщик.
– Да вон на конце, к большому, как ты не видишь! Это наш дом, – говорил Ростов, – ведь это наш дом! Денисов! Денисов! Сейчас приедем.
Денисов поднял голову, откашлялся и ничего не ответил.
– Дмитрий, – обратился Ростов к лакею на облучке. – Ведь это у нас огонь?
– Так точно с и у папеньки в кабинете светится.
– Еще не ложились? А? как ты думаешь? Смотри же не забудь, тотчас достань мне новую венгерку, – прибавил Ростов, ощупывая новые усы. – Ну же пошел, – кричал он ямщику. – Да проснись же, Вася, – обращался он к Денисову, который опять опустил голову. – Да ну же, пошел, три целковых на водку, пошел! – закричал Ростов, когда уже сани были за три дома от подъезда. Ему казалось, что лошади не двигаются. Наконец сани взяли вправо к подъезду; над головой своей Ростов увидал знакомый карниз с отбитой штукатуркой, крыльцо, тротуарный столб. Он на ходу выскочил из саней и побежал в сени. Дом также стоял неподвижно, нерадушно, как будто ему дела не было до того, кто приехал в него. В сенях никого не было. «Боже мой! все ли благополучно?» подумал Ростов, с замиранием сердца останавливаясь на минуту и тотчас пускаясь бежать дальше по сеням и знакомым, покривившимся ступеням. Всё та же дверная ручка замка, за нечистоту которой сердилась графиня, также слабо отворялась. В передней горела одна сальная свеча.
Старик Михайла спал на ларе. Прокофий, выездной лакей, тот, который был так силен, что за задок поднимал карету, сидел и вязал из покромок лапти. Он взглянул на отворившуюся дверь, и равнодушное, сонное выражение его вдруг преобразилось в восторженно испуганное.
– Батюшки, светы! Граф молодой! – вскрикнул он, узнав молодого барина. – Что ж это? Голубчик мой! – И Прокофий, трясясь от волненья, бросился к двери в гостиную, вероятно для того, чтобы объявить, но видно опять раздумал, вернулся назад и припал к плечу молодого барина.
– Здоровы? – спросил Ростов, выдергивая у него свою руку.
– Слава Богу! Всё слава Богу! сейчас только покушали! Дай на себя посмотреть, ваше сиятельство!
– Всё совсем благополучно?
– Слава Богу, слава Богу!
Ростов, забыв совершенно о Денисове, не желая никому дать предупредить себя, скинул шубу и на цыпочках побежал в темную, большую залу. Всё то же, те же ломберные столы, та же люстра в чехле; но кто то уж видел молодого барина, и не успел он добежать до гостиной, как что то стремительно, как буря, вылетело из боковой двери и обняло и стало целовать его. Еще другое, третье такое же существо выскочило из другой, третьей двери; еще объятия, еще поцелуи, еще крики, слезы радости. Он не мог разобрать, где и кто папа, кто Наташа, кто Петя. Все кричали, говорили и целовали его в одно и то же время. Только матери не было в числе их – это он помнил.