sqlite3 is a terminal-based front-end to the SQLite library that can evaluate queries interactively and display the results in multiple formats. sqlite3 can also be used within shell scripts and other applications to provide batch processing features.
DESCRIPTION
To start a sqlite3 interactive session, invoke the sqlite3 command and optionally provide the name of a database file. If the database file does not exist, it will be created. If the database file does exist, it will be opened.
For example, to create a new database file named «mydata.db», create a table named «memos» and insert a couple of records into that table:
$ sqlite3 mydata.db
SQLite version 3.1.3
Enter «.help» for instructions
sqlite> create table memos(text, priority INTEGER);
sqlite> insert into memos values(‘deliver project description’, 10);
sqlite> insert into memos values(‘lunch with Christine’, 100);
sqlite> select * from memos;
Что такое SQL? — введение в Sqlite
deliver project description|10
lunch with Christine|100
sqlite>
If no database name is supplied, the ATTACH sql command can be used to attach to existing or create new database files. ATTACH can also be used to attach to multiple databases within the same interactive session. This is useful for migrating data between databases, possibly changing the schema along the way.
Optionally, a SQL statement or set of SQL statements can be supplied as a single argument. Multiple statements should be separated by semi-colons.
$ sqlite3 -line mydata.db ‘select * from memos where priority > 20;’
text = lunch with Christine
priority = 100
SQLITE META-COMMANDS
The interactive interpreter offers a set of meta-commands that can be used to control the output format, examine the currently attached database files, or perform administrative operations upon the attached databases (such as rebuilding indices). Meta-commands are always prefixed with a dot (.).
A list of available meta-commands can be viewed at any time by issuing the ‘.help’ command. For example:
.databases List names and files of attached databases .dump ?TABLE? . Dump the database in an SQL text format .echo ON|OFF Turn command echo on or off .exit Exit this program .explain ON|OFF Turn output mode suitable for EXPLAIN on or off. .header(s) ON|OFF Turn display of headers on or off .help Show this message .import FILE TABLE Import data from FILE into TABLE .indices TABLE Show names of all indices on TABLE .mode MODE ?TABLE? Set output mode where MODE is one of: csv Comma-separated values column Left-aligned columns. (See .width) html HTML code insert SQL insert statements for TABLE line One value per line list Values delimited by .separator string tabs Tab-separated values tcl TCL list elements .nullvalue STRING Print STRING in place of NULL values .output FILENAME Send output to FILENAME .output stdout Send output to the screen .prompt MAIN CONTINUE Replace the standard prompts .quit Exit this program .read FILENAME Execute SQL in FILENAME .schema ?TABLE?
Show the CREATE statements .separator STRING Change separator used by output mode and .import .show Show the current values for various settings .tables ?PATTERN? List names of tables matching a LIKE pattern .timeout MS Try opening locked tables for MS milliseconds .width NUM NUM . Set column widths for «column» mode sqlite>
OPTIONS
SQLITE 3 Python [ 1 ] | Создание таблицы, добавление данных, проверка и вывод.
sqlite3 has the following options: -init file Read and execute commands from file , which can contain a mix of SQL statements and meta-commands. -echo Print commands before execution. -[no]header Turn headers on or off. -column Query results will be displayed in a table like form, using whitespace characters to separate the columns and align the output. -html Query results will be output as simple HTML tables. -line Query results will be displayed with one value per line, rows separated by a blank line. Designed to be easily parsed by scripts or other programs -list Query results will be displayed with the separator (|, by default) character between each field value. The default. -separator separator Set output field separator. Default is ‘|’. -nullvalue string Set string used to represent NULL values. Default is » (empty string). -version Show SQLite version. -help Show help on options and exit.
INIT FILE
sqlite3 reads an initialization file to set the configuration of the interactive environment. Throughout initialization, any previously specified setting can be overridden. The sequence of initialization is as follows:
o The default configuration is established as follows:
mode = LIST separator = «|» main prompt = «sqlite> » continue prompt = » . > »
o If the file ~/.sqliterc exists, it is processed first. can be found in the user’s home directory, it is read and processed. It should generally only contain meta-commands.
o If the -init option is present, the specified file is processed.
o All other command line options are processed.
SEE ALSO
http://www.sqlite.org/
The sqlite-doc package
AUTHOR
This manual page was originally written by Andreas Rottmann , for the Debian GNU/Linux system (but may be used by others). It was subsequently revised by Bill Bumgarner .
Index
Закладки на сайте Проследить за страницей |
Created 1996-2023 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |
Источник: www.opennet.ru
SQLite — замечательная встраиваемая БД (часть 1)
Решил все-таки написать статью про 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.
Продолжение следует.
Источник: habr.com
Обзор версии 3 SQLite
В SQLite версии 3.0 внесены важные изменения в библиотеку,в том числе:
- Более компактный формат для файлов базы данных.
- Манифест набора и поддержка BLOB.
- Поддержка как UTF-8,так и UTF-16 текста.
- Определенные пользователем текстовые коллекционные последовательности.
- 64-bit ROWIDs.
- Improved Concurrency.
Этот документ является кратким введением в изменения для SQLite 3.0 для пользователей,которые уже знакомы с SQLite версии 2.8.
Naming Changes
В обозримом будущем поддержка SQLite версии 2.8 будет продолжена с исправлениями ошибок.Для того чтобы SQLite версии 2.8 и SQLite версии 3.0 могли мирно сосуществовать,имена ключевых файлов и API в SQLite версии 3.0 были изменены на символ «3».Например,включаемый файл,используемый программами на C,изменен с «sqlite.h» на «sqlite3.h».А название оболочки программы,используемой для взаимодействия с базами данных,изменено с «sqlite.exe» на «sqlite3.exe».С этими изменениями можно установить на одну и ту же систему одновременно и SQLite 2.8,и SQLite 3.0.Причем одна и та же программа на C может линковать одновременно и с SQLite 2.8,и с SQLite 3.0 и использовать обе библиотеки одновременно.
Новый формат файла
Формат,используемый файлами базы данных SQLite,был полностью пересмотрен.Старая версия 2.1 и новый формат 3.0 несовместимы друг с другом.Версия 2.8 SQLite не будет читать файлы баз данных версии 3.0 и версия 3.0 SQLite не будет читать файл базы данных версии 2.8.
Для преобразования базы данных SQLite 2.8 в базу данных SQLite 3.0,подготовьте оболочки командной строки для версий 2.8 и 3.0.Затем введите следующую команду:
sqlite OLD.DB .dump | sqlite3 NEW.DB
Новый формат файла базы данных использует B+деревья для таблиц.В B+tree все данные хранятся в листьях дерева,а не в листьях и промежуточных узлах ветвей.Использование B+tree для таблиц позволяет улучшить масштабируемость и хранение больших полей данных без использования страниц переполнения.Традиционные B-деревья по-прежнему используются для индексов.
Новый формат файлов также поддерживает переменный размер страниц от 512 до 65536 байт.Размер страницы хранится в заголовке файла,так что одна и та же библиотека может читать базы данных с разными размерами страниц,теоретически,хотя эта возможность еще не реализована на практике.
Новый формат файла исключает неиспользуемые поля из образов диска.Например,индексы используют только ключевую часть записи B-дерева,а не данные.Таким образом,для индексов опускается поле,записывающее длину данных.Целые значения,такие как длина ключа и данных,хранятся в кодировке переменной длины,так что для хранения наиболее распространенных случаев требуется только один или два байта,но при необходимости можно закодировать до 64 бит информации.Целые данные и данные с плавающей запятой хранятся на диске в двоичном виде,а не преобразуются в ASCII,как в SQLite версии 2.8.Эти изменения,взятые вместе,приводят к тому,что файлы базы данных,как правило,на 25-35% меньше,чем эквивалентные файлы в SQLite версии 2.8.
Подробные сведения о низкоуровневом формате B-дерева, используемом в SQLite версии 3.0, можно найти в комментариях заголовков к исходному файлу btreeInt.h и в документации по формату файлов .
Манифест ввода и BLOB-поддержка
SQLite версии 2.8 будет работать с данными в различных форматах внутренне,но при записи на диск или при взаимодействии через API,SQLite 2.8 всегда преобразует данные в ASCII текст.SQLite 3.0,напротив,раскрывает свои внутренние представления данных пользователю и хранит двоичные представления на диске,когда это необходимо.Для поддержки BLOB добавлено отображение не-ASCII-представлений.
В SQLite версии 2.8 была реализована возможность хранения данных любого типа в любом столбце таблицы независимо от объявленного типа этого столбца.Эта возможность сохранена в версии 3.0,хотя и в слегка измененном виде.Каждый столбец таблицы будет хранить данные любого типа,хотя столбцы имеют сходство с форматом данных,определенным их объявленным типом.Когда данные вставляются в столбец,в этом столбце будет сделана попытка преобразования формата данных в объявленный тип столбца.Это делают все движки баз данных SQL.Разница заключается в том,что в SQLite 3.0 данные все равно будут храниться,даже если преобразование формата невозможно.
Например,если у вас столбец таблицы,объявленный как тип «INTEGER» и вы пытаетесь вставить строку,то столбец посмотрит на текстовую строку и увидит,не выглядит ли она как число.Если строка действительно выглядит как число,то она преобразуется в число и в целое число,если число не имеет дробной части,и сохраняется таким образом.Но если строка не является хорошо сформированным числом,она все равно хранится как строка.Столбец с типом «TEXT» пытается преобразовать числа в ASCII-Text представление перед их хранением.Но BLOB-номера хранятся в TEXT-столбцах как BLOB-номера,так как в общем случае невозможно преобразовать BLOB-номера в текст.
В большинстве других механизмов баз данных SQL тип данных связан со столбцом таблицы, в котором хранятся данные, — с контейнером данных. В SQLite 3.0 тип данных связан с самими данными, а не с их контейнером. Пол Грэм в своей книге ANSI Общая лиза называет это свойство «Манифестный набор».У других авторов есть другие определения термина «манифестный набор текста»,поэтому остерегайтесь путаницы.Но под любым именем,это модель типа данных,поддерживаемая SQLite 3.0.
Дополнительная информация о типах данных в SQLite версии 3.0 доступна отдельно .
Поддержка UTF-8 и UTF-16
Новый API для SQLite 3.0 содержит подпрограммы,которые принимают текст как UTF-8,так и UTF-16 в родном порядке байт хост-машины.Каждый файл базы данных управляет текстом в формате UTF-8,UTF-16BE (big-endian)или UTF-16LE (little-endian).Внутри и в дисковом файле везде используется одно и то же текстовое представление.Если текстовое представление,заданное файлом БД (в заголовке файла),не совпадает с текстовым представлением,требуемым подпрограммами интерфейса,то текст преобразуется «на лету».Постоянное преобразование текста из одного представления в другое может быть связано с большими вычислительными затратами,поэтому программистам предлагается выбрать одно представление и придерживаться его во всем своем приложении.
В текущей реализации SQLite парсер SQL работает только с UTF-8 текстом.Поэтому при поставке текста в кодировке UTF-16 он будет конвертирован.Это просто проблема реализации и ничто не мешает будущим версиям SQLite самостоятельно разобрать SQL в кодировке UTF-16.
При создании новых пользовательских SQL-функций и коллекционировании последовательностей каждая функция или коллекционирующая последовательность может указать,работает ли она с UTF-8,UTF-16be или UTF-16le.Для каждой кодировки могут быть зарегистрированы отдельные реализации.Если требуется SQL-функция или коллекционная последовательность,но версия для текущей текстовой кодировки недоступна,то текст автоматически преобразуется.Как и раньше,такое преобразование занимает время вычислений,поэтому программистам рекомендуется выбрать одну кодировку и придерживаться ее,чтобы свести к минимуму количество ненужного жонглирования форматом.
SQLite не требователен к получаемому тексту и с удовольствием обрабатывает текстовые строки,которые не являются нормализованными или даже хорошо сформированными UTF-8 или UTF-16.Таким образом,программисты,которые хотят хранить данные ISO8859,могут делать это,используя интерфейсы UTF-8.До тех пор,пока не будут предприняты попытки использовать последовательность свертки UTF-16 или функции SQL,последовательность байтов текста не будет изменена никоим образом.
Определяемые пользователем последовательности коллекционирования
Последовательность сортировки — это просто определенный порядок текста. Когда SQLite 3.0 выполняет сортировку (или использует оператор сравнения, например « =»), порядок сортировки сначала определяется типом данных.
- NULLs сортируются первыми
- Числовые значения сортируются следующим образом в числовом порядке
- Текстовые значения идут после цифр
- BLOB-сообщения сортируются последними
Для сравнения двух текстовых строк используются коллекционные последовательности.Коллатирующая последовательность не изменяет порядок следования NULLs,чисел или BLOBs,а только текста.
Коллатирующая последовательность реализуется как функция,которая принимает две сравниваемые строки за входы и возвращает отрицательный,нулевой или положительный результат,если первая строка меньше,равна или больше второй.SQLite 3.0 поставляется с единственной встроенной коллатирующей последовательностью с именем «BINARY»,которая реализуется с помощью рутины memcmp()из стандартной библиотеки языка Си.Коллатирующая последовательность BINARY хорошо работает для английского текста.Для других языков или локалей может быть предпочтительнее использовать альтернативные коллекционные последовательности.
Решение о том,какую коллекционную последовательность использовать,контролируется в SQL с помощью выражения COLLATE.Оговорка COLLATE может встречаться в определении таблицы,в определении коллизионной последовательности по умолчанию к столбцу таблицы,или к полю индекса,или в пункте ORDER BY оператора SELECT.Планируемые усовершенствования SQLite включают стандартный синтаксис CAST(),позволяющий определять коллекционную последовательность выражения.
64-bit ROWIDs
Каждый ряд таблицы имеет уникальную рябину.Если таблица определяет столбец с типом «INTEGER PRIMARY KEY»,то этот столбец становится псевдонимом для rowid.Но со столбцом «INTEGER PRIMARY KEY» или без него,каждая строка все равно имеет уникальный rowid.
В SQLite версии 3.0 rowid представляет собой 64-битное целое число с цифровой подписью.Это расширение SQLite версии 2.8,которое разрешает использовать только рядки из 32 бит.
Для минимизации дискового пространства 64-битный рядик хранится в виде целого числа переменной длины.Рядки от 0 до 127 используют только один байт.Скорости от 0 до 16383 используют всего 2 байта.До 2097152 использует три байта.И так далее.Отрицательные ряды разрешены,но они всегда используют девять байт памяти,поэтому их использование не рекомендуется.Когда рядовые автоматически генерируются SQLite,они всегда будут неотрицательными.
Improved Concurrency
SQLite версии 2.8 допускает одновременное использование нескольких считывателей или одного модуля записи, но не обоих одновременно. SQLite версии 3.0 позволяет одному процессу начать запись в базу данных, в то время как другие процессы продолжают читать. Писатель должен получить монопольную блокировку базы данных на короткий промежуток времени, чтобы зафиксировать свои изменения, но монопольная блокировка больше не требуется для всей операции записи. Более подробный отчет о стопорного поведении SQLite версии 3.0 поставляется отдельно.
Ограниченная форма блокировки на уровне таблиц теперь доступна и в SQLite.Если каждая таблица хранится в отдельном файле БД,то эти отдельные файлы могут быть прикреплены к основной БД (с помощью команды ATTACH),и объединенные БД будут функционировать как единое целое.Но блокировки будут приобретаться только на отдельных файлах по мере необходимости.Таким образом,если заново определить «БД» как два или более файлов БД,то вполне возможно,что два процесса будут записываться в одну и ту же БД одновременно.Для дальнейшей поддержки этой возможности,коммиты транзакций с двумя и более БД ATTACHed теперь атомарные.
Credits
SQLite версии 3.0 частично стал возможен благодаря разработчикам AOL,поддерживающим и использующим отличное Open-Source программное обеспечение.
SQLite 3.40
При объединении две или более таблиц объединяются для получения одного результата.
Использование выражений SELECT как терминов в выражении
Само название «Язык структурированных запросов» говорит нам о том, что SQL должен поддерживать вложенные запросы.
Номера версий в SQLite
Начиная с версии 3.9.0 (2015-10-14)SQLite использует семантическое версионирование.
Интерфейс ОС SQLite или «VFS»
В этой статье описывается модуль «VFS» уровня переносимости ОС SQLite, который находится в нижней части стека реализации и обеспечивает работу в разных операционных системах.
Источник: runebook.dev