RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.
Командная строка для SQLite
Оглавление

1. Начало

Проект SQLite предоставляет простую программу командной строки, названную sqlite3 (sqlite3.exe в Windows), которая позволяет пользователю вручную выполнять SQL-операторы для базы данных SQLite или ZIP-архива. Этот документ обеспечивает краткое введение о том, как использовать sqlite3.

Запустите sqlite3, введя "sqlite3" в командной строке, произвольно сопровождаемой названием файла, который содержит базу данных SQLite (или ZIP-архив). Если названный файл не будет существовать, новый файл базы данных с именем будет создан автоматически. Если никакой файл базы данных не определяется в командной строке, временная база данных создана и автоматически удалена, когда "sqlite3" завершена.

На запуске sqlite3 покажет краткое сообщение баннера и запрос ввода SQL. Напечатайте SQL-операторы (законченные точкой с запятой), нажмите "Enter" и SQL выполнится.

Например, чтобы создать новую базу данных SQLite, названную "ex1" с единственной таблицей "tbl1":

$ sqlite3 ex1
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
sqlite> create table tbl1(one text, two int);
sqlite> insert into tbl1 values('hello!',10);
sqlite> insert into tbl1 values('goodbye', 20);
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite>

Закончите sqlite3, печатая ваш системный символ End-Of-File (обычно нажмите Control-D). Используйте символ прерывания (обычно Control-C), чтобы остановить продолжительный SQL-оператор.

Удостоверьтесь, что вы печатаете точку с запятой в конце каждой команды SQL! sqlite3 ищет точку с запятой, чтобы знать, когда ваша команда SQL закончена. Если вы опустите точку с запятой, то sqlite3 даст вам продолжение ввода и ждет больше текста, чтобы закончить команду SQL. Эта особенность позволяет многострочные команды SQL:

sqlite> CREATE TABLE tbl2 (
   ...>   f1 varchar(30) primary key,
   ...>   f2 text,
   ...>   f3 real
   ...> );
sqlite>

2. Запуск в Windows

Пользователи Windows могут дважды щелкнуть по sqlite3.exe, чтобы вызвать оболочку командной строки к всплывающему окну терминала, управляющему SQLite. Однако, потому что двойной щелчок начинает sqlite3.exe без параметров командной строки, никакой файл базы данных не будет определен, таким образом, SQLite будет использовать временную базу данных, которая удалена, когда сессия завершится. Чтобы использовать постоянный дисковый файл в качестве базы данных, введите команду ".open" немедленно после того, как окно терминала запустится:

SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .open ex1.db
sqlite>

Пример выше заставляет файл базы данных, названный "ex1.db" открываться и использоваться. "ex1.db" файл создается, если он ранее не существует. Вы могли бы хотеть использовать полный путь, чтобы гарантировать, что файл находится в нужном каталоге. Используйте наклонные черты вправо в качестве директивного символа разделителя. Другими словами, используйте "c:/work/ex1.db", а не "c:\work\ex1.db".

Альтернативно, можно создать новую базу данных, используя временное хранение по умолчанию, затем сохранить эту базу данных в дисковый файл, используя команду ".save":

SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> ... many SQL commands omitted ...
sqlite> .save ex1.db
sqlite>

Будьте осторожны, когда используете команду ".save", поскольку это перепишет любые существующие ранее файлы базы данных, имеющие то же самое имя без подтверждения. Как с командой ".open", вы могли бы хотеть использовать полный путь с директивными сепараторами наклонной черты вправо, чтобы избежать двусмысленности.

3. Команды для sqlite3

Большую часть времени, sqlite3 просто читает строки ввода и передает их в библиотеку SQLite для выполнения. Но входные строки, которые начинаются с точки (". "), перехватываются и интерпретируются самой программой sqlite3. Эти "точечные команды", как правило, используются, чтобы изменить выходной формат запросов или выполнить определенные предварительно упакованные запросы. Было первоначально всего несколько точечных команд, но за эти годы много новых особенностей накопились.

Для списка доступных точечных команд можно ввести ".help" без аргументов. Или введите ".help TOPIC" для получения дальнейшей информации о TOPIC. Список доступных точечных команд:

sqlite> .help
.archive ...             Manage SQL archives
.auth ON|OFF             Show authorizer callbacks
.backup ?DB? FILE        Backup DB (default "main") to FILE
.bail on|off             Stop after hitting an error.  Default OFF
.cd DIRECTORY            Change the working directory to DIRECTORY
.changes on|off          Show number of rows changed by SQL
.check GLOB              Fail if output since .testcase does not match
.clone NEWDB             Clone data into NEWDB from the existing database
.connection [close] [#]  Open or close an auxiliary database connection
.databases               List names and files of attached databases
.dbconfig ?op? ?val?     List or change sqlite3_db_config() options
.dbinfo ?DB?             Show status information about the database
.dump ?OBJECTS?          Render database content as SQL
.echo on|off             Turn command echo on or off
.eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN
.excel                   Display the output of next command in spreadsheet
.exit ?CODE?             Exit this program with return-code CODE
.expert                  EXPERIMENTAL. Suggest indexes for queries
.explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto
.filectrl CMD ...        Run various sqlite3_file_control() operations
.fullschema ?--indent?   Show schema and the content of sqlite_stat tables
.headers on|off          Turn display of headers on or off
.help ?-all? ?PATTERN?   Show help text for PATTERN
.import FILE TABLE       Import data from FILE into TABLE
.imposter INDEX TABLE    Create imposter table TABLE on index INDEX
.indexes ?TABLE?         Show names of indexes
.limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT
.lint OPTIONS            Report potential schema issues.
.load FILE ?ENTRY?       Load an extension library
.log FILE|off            Turn logging on or off.  FILE can be stderr/stdout
.mode MODE ?TABLE?       Set output mode
.nonce STRING            Disable safe mode for one command if the nonce matches
.nullvalue STRING        Use STRING in place of NULL values
.once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE
.open ?OPTIONS? ?FILE?   Close existing database and reopen FILE
.output ?FILE?           Send output to FILE or stdout if FILE is omitted
.parameter CMD ...       Manage SQL parameter bindings
.print STRING...         Print literal STRING
.progress N              Invoke progress handler after every N opcodes
.prompt MAIN CONTINUE    Replace the standard prompts
.quit                    Stop interpreting input stream, exit if primary.
.read FILE               Read input from FILE
.recover                 Recover as much data as possible from corrupt db.
.restore ?DB? FILE       Restore content of DB (default "main") from FILE
.save FILE               Write in-memory database into FILE
.scanstats on|off        Turn sqlite3_stmt_scanstatus() metrics on or off
.schema ?PATTERN?        Show the CREATE statements matching PATTERN
.selftest ?OPTIONS?      Run tests defined in the SELFTEST table
.separator COL ?ROW?     Change the column and row separators
.session ?NAME? CMD ...  Create or control sessions
.sha3sum ...             Compute a SHA3 hash of database content
.shell CMD ARGS...       Run CMD ARGS... in a system shell
.show                    Show the current values for various settings
.stats ?ARG?             Show stats or turn stats on or off
.system CMD ARGS...      Run CMD ARGS... in a system shell
.tables ?TABLE?          List names of tables matching LIKE pattern TABLE
.testcase NAME           Begin redirecting output to 'testcase-out.txt'
.testctrl CMD ...        Run various sqlite3_test_control() operations
.timeout MS              Try opening locked tables for MS milliseconds
.timer on|off            Turn SQL timer on or off
.trace ?OPTIONS?         Output each SQL statement as it is run
.vfsinfo ?AUX?           Information about the top-level VFS
.vfslist                 List all available VFSes
.vfsname ?AUX?           Print the name of the VFS stack
.width NUM1 NUM2 ...     Set minimum column widths for columnar output
sqlite>

4. Правила для команд и SQL

4.1. Структура строки

Ввод CLI разобран в последовательность, состоящую из:

  • Операторов SQL
  • Точечных команд
  • Комментариев CLI

Команды SQL это свободная форма и могут быть иметь много строк с пробелами или комментариями SQL, включенными где угодно. Они закончены любым символом ';' в конце входной строки, символом '/' или словом "go" в отдельной строке. Если не в конце входной строки, символ ';' действует, чтобы отделить SQL-операторы. Конечные пробелы проигнорированы.

У точечной команды есть более строгая структура:

  • Это должно начаться с "." в левом поле без пробелов в начале.
  • Это должно полностью содержаться на единственной входной строке.
  • Это не может произойти посреди обычного SQL-оператора. Другими словами, это не может произойти при продолжении ввода.
  • Нет никакого синтаксиса комментария для точечных команд.

CLI также принимает комментарии целой строки, которые начинаются с '#' и до конца строки.

4.2. Параметры команд

Аргументы, переданные к точечным командам, разобраны от хвоста команды:

  1. Новая строка и концевые пробелы игнорируются.
  2. Пробелы немедленно после названия команды или любого аргумента игнорируются.
  3. Вход аргумента начинается с любого непробельного символа.
  4. Аргумент кончается символом, который зависит от его начального символа таким образом:
    • Для ведущей одинарной кавычки ('), одинарная кавычка действует как конечный ограничитель.
    • Для ведущей двойной кавычки ("), неэкранированная двойная кавычка действует как конечный ограничитель.
    • Для любого другого начального символа конечный ограничитель это любой пробел.
    • Заключительная часть команды действует как конечный ограничитель для любого аргумента.
  5. В аргументе в двойных кавычках экранированная наклонной чертой влево двойная кавычка это часть аргумента, а не его завершающая кавычка.
  6. В аргументе традиционной C-строки в двойных кавычках сделан буквальный перевод escape-последовательности наклонной черты влево.
  7. Разделители в аргументе (кавычки или пробелы) игнориуются, чтобы получить передаваемый аргумент.

4.3. Выполнение команд

Точечные команды интерпретируются программой командной строки sqlite3.exe, а не самим SQLite. Таким образом, ни одна из точечных команд не будет работать аргументом интерфейса SQLite, таким как sqlite3_prepare() или sqlite3_exec().

5. Изменение формата вывода

sqlite3 в состоянии показать результаты запроса в 14 различных выходных форматах:

  • ascii
  • box
  • csv
  • column
  • html
  • insert
  • json
  • line
  • list
  • markdown
  • quote
  • table
  • tabs
  • tcl

Можно использовать команду точки ".mode", чтобы переключиться между этими выходными форматами. Режим вывода по умолчанию "list". В режиме списка каждая строка результата запроса написана на одной строке и каждая колонка в той строке отделена определенной строкой разделителя. Сепаратор по умолчанию: символ вертикальной черты ("|"). Режим списка особенно полезен, когда вы собираетесь послать вывод запроса другой программе (такой как AWK) для дополнительной обработки.

sqlite> .mode list
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite>

Напечатайте ".mode" без аргументов, чтобы показать текущий режим:

sqlite> .mode
current output mode: list
sqlite>

Используйте команду точки ".separator", чтобы изменить сепаратор. Например, чтобы изменить сепаратор на запятую и пробел, вы могли сделать это:

sqlite> .separator ", "
sqlite> select * from tbl1;
hello!, 10
goodbye, 20
sqlite>

Следующая команда ".mode" могла бы перезагрузить ".separator" назад к некоторому значению по умолчанию (в зависимости от его аргументов). Таким образом, необходимо будет, вероятно, повторить команду ".separator" каждый раз, когда вы изменяете режимы, если вы хотите продолжить использовать нестандартный сепаратор.

В режиме "quote" вывод отформатирован как литералы SQL. Последовательности даны в одинарных кавычках, внутренние одинарные кавычки экранированы удвоением. Blob показаны в шестнадцатеричной литеральной нотации blob (например: x'abcd'). Числа показаны как текст ASCII, NULL выводятся как "NULL". Все колонки отделены друг от друга запятой (независимо от того, что альтернативный символ выбран, используя ".separator").

sqlite> .mode quote
sqlite> select * from tbl1;
'hello!',10
'goodbye',20
sqlite>

В режиме "line" каждую колонку базы данных показывают на отдельной строке. Каждая строка состоит из имени столбца, знака "равно" и данных о колонке. Последовательные записи отделены пустой строкой. Вот пример вывода:

sqlite> .mode line
sqlite> select * from tbl1;
one = hello!
two = 10

one = goodbye
two = 20
sqlite>
В режиме column каждую запись показывают на отдельной строке с данными, выровненными в колонках. Например:

sqlite> .mode column
sqlite> select * from tbl1;
one       two
--------  ---
hello!    10
goodbye   20
sqlite>

В режиме "column" (а также в "box", "table" и "markdown") ширина колонок приспосабливается автоматически. Но можно отвергнуть это, обеспечив указанную ширину для каждой колонки, используя команду ".width". Аргументы ".width" это integer, которые являются количеством знаков, чтобы выделить каждой колонке. Отрицательные числа означают выравнивание вправо:

sqlite> .width 12 -6
sqlite> select * from tbl1;
one              two
------------  ------
hello!            10
goodbye           20
sqlite>

Ширина 0 означает, что ширина столбца выбрана автоматически. Неуказанная ширина столбцов становится нолем. Следовательно, команда ".width" без аргументов перезагружает всю ширину столбцов к нолю и следовательно заставляет всю ширину столбцов быть определенной автоматически.

Режим "column" это табличный выходной формат. Другие табличные выходные форматы: "box", "markdown" и "table":

sqlite> .width
sqlite> .mode markdown
sqlite> select * from tbl1;
|   one   | two |
|---------|-----|
| hello!  | 10  |
| goodbye | 20  |

sqlite> .mode table
sqlite> select * from tbl1;
+---------+-----+
|   one   | two |
+---------+-----+
| hello!  | 10  |
| goodbye | 20  |
+---------+-----+

sqlite> .mode box
sqlite> select * from tbl1;
Б■▄Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■╛Б■─Б■─Б■─Б■─Б■─Б■░
Б■┌   one   Б■┌ two Б■┌
Б■°Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■╪Б■─Б■─Б■─Б■─Б■─Б■╓
Б■┌ hello!  Б■┌ 10  Б■┌
Б■┌ goodbye Б■┌ 20  Б■┌
Б■■Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■╢Б■─Б■─Б■─Б■─Б■─Б■≤
sqlite>
Колоночные режимы принимают некоторые дополнительные варианты, чтобы управлять форматированием. Опция "--wrap N" (здесь N integer) заставляет колонки переносить текст, который более длинен, чем N знаков. Это отключено, если N ноль.

sqlite> insert into tbl1 values('The quick fox jumps over a lazy brown dog.',90);
sqlite> .mode box --wrap 30
sqlite> select * from tbl1 where two>50;
Б■▄Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■╛Б■─Б■─Б■─Б■─Б■─Б■░
Б■┌              one               Б■┌ two Б■┌
Б■°Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■╪Б■─Б■─Б■─Б■─Б■─Б■╓
Б■┌ The quick fox jumps over a laz Б■┌ 90  Б■┌
Б■┌ y brown dog.                   Б■┌     Б■┌
Б■■Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■╢Б■─Б■─Б■─Б■─Б■─Б■≤
sqlite>

Перенос происходит после точно N-го знака, возможно посреди слова. Чтобы перенести на границе слова, добавьте опцию "--wordwrap on" (краткая форма: "-ww"):

sqlite> .mode box --wrap 30 -ww
sqlite> select * from tbl1 where two>50;
Б■▄Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■╛Б■─Б■─Б■─Б■─Б■─Б■░
Б■┌             one             Б■┌ two Б■┌
Б■°Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■╪Б■─Б■─Б■─Б■─Б■─Б■╓
Б■┌ The quick fox jumps over a  Б■┌ 90  Б■┌
Б■┌ lazy brown dog.             Б■┌     Б■┌
Б■■Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■─Б■╢Б■─Б■─Б■─Б■─Б■─Б■≤
sqlite>

Опция "--quote" заставляет результаты в каждой колонке быть цитированными как литерал SQL, как в режиме "quote". Посмотрите помощь онлайн для дополнительных опций.

Команда ".mode box --wrap 60 --quote" столь полезна для запросов базы данных общего назначения, что имеет собственный псевдоним. Вместо того, чтобы печатать эту 27-символьную команду, можно просто сказать ".mode qbox".

Другой полезный режим вывода: "insert". В режиме вставки вывод отформатирован, чтобы быть похожим операторы INSERT SQL. Используйте режим вставки, чтобы произвести текст, который может позже использоваться, чтобы ввести данные в иную базу данных.

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

sqlite> .mode insert new_table
sqlite> select * from tbl1 where two<50;
INSERT INTO "new_table" VALUES('hello',10);
INSERT INTO "new_table" VALUES('goodbye',20);
sqlite>

Другие режимы вывода включают "csv", "json" и "tcl". Попробуйте их сами, чтобы видеть то, что они делают.

6. Запрос схемы базы данных

sqlite3 обеспечивает несколько команд удобства, которые полезны для рассмотрения схемы базы данных. Нет ничего, что эти команды делают, но не может быть сделано другими средствами. Эти команды обеспечиваются просто как короткий путь.

Например, чтобы видеть список таблиц в базе данных, можно скомандовать ".tables".

sqlite> .tables
tbl1 tbl2
sqlite>

".tables" подобна режиму списка, выполняющего следующий запрос:

SELECT name FROM sqlite_schema WHERE type IN ('table','view') AND
       name NOT LIKE 'sqlite_%' ORDER BY 1

Но команда ".tables" делает больше. Это запрашивает таблицу sqlite_schema для всех присоединенных БД, не только основной базы данных. И это устраивает свой вывод в нормальные колонки.

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

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

sqlite> .schema
create table tbl1(one varchar(10), two smallint)
CREATE TABLE tbl2 (f1 varchar(30) primary key, f2 text, f3 real);
sqlite> .schema tbl2
CREATE TABLE tbl2 (f1 varchar(30) primary key, f2 text, f3 real);
sqlite>

Команда ".schema" примерно то же самое, как режим списка, затем выполняет следующий запрос:

SELECT sql FROM sqlite_schema ORDER BY tbl_name, type DESC, name

Как ".tables", ".schema" показывает схему для всех присоединенных БД. Если вы хотите видеть только схему для одной базы данных (возможно, "main"), можно добавить аргумент ".schema", чтобы ограничить вывод:

sqlite> .schema main.*

".schema" может быть увеличена опцией "--indent", в этом случае это пытается переформатировать различные запросы CREATE так, чтобы они были более легко удобочитаемы людьми.

".databases" показывает список всех баз данных, открытых в текущей связи. Всегда будут по крайней мере 2. Первая "main", это оригинальная открытая база данных. Вторым "temp" это база данных, используемая для временных таблиц. Могут быть дополнительные базы данных, перечисленные для баз данных, приложенных, используя команду ATTACH. Первая колонка вывода задает имя, с которым приложена база данных, второй столбец результата это имя файла внешнего файла. Может быть третий столбец результата, который будет "'r/o'" или "'r/w'", в зависимости от того, открыт ли файл базы данных только для чтения. Мог бы быть четвертый столбец результата, показав результат sqlite3_txn_state() для того файла базы данных.

sqlite> .databases

".fullschema" работает как ".schema", в которой она показывает всю схему базы данных. Но ".fullschema" также включает дамп таблиц "sqlite_stat1", "sqlite_stat3" и "sqlite_stat4", если они есть. ".fullschema" обычно обеспечивает всю информация, чтобы точно воссоздать план для определенного запроса. Когда сообщают подозреваемые проблемы с планировщиком запросом SQLite, разработчикм требуют обеспечить полный вывод ".fullschema" как часть отчета о проблеме. Обратите внимание на то, что таблицы sqlite_stat3 и sqlite_stat4 содержат образцы элементов индекса и так могли бы содержать уязвимые данные, поэтому не посылайте вывод ".fullschema" собственной базы данных по общественному каналу.

7. Открытие файлов базы данных

".open" открывает новое соединение с базой данных после первого закрытия ранее открытой команды базы данных. В самой простой форме команда ".open" просто вызывает sqlite3_open() на файле, названном как его аргумент. Используйте имя ":memory:", чтобы открыть новую базу данных в памяти, которая исчезает, когда CLI завершается или когда команду ".open" выполнят снова. Или не используйте имя, чтобы открыть временную базу данных на диске, которая также исчезнет при выходе или использовании команды ".open".

Если опция --new включена в ".open", база данных перезагружается до того, как откроется. Любые предшествующие данные разрушены. Это разрушительное переписывание предшествующих данных, никакое подтверждение не требуется, так что используйте этот выбор осторожно.

Опция --readonly открывает базу данных в режиме только для чтения. Запись будет блокирована.

--deserialize читает все содержание дискового файла в память и затем открывает как базу данных в памяти, используя sqlite3_deserialize(). Это, конечно, потребует большой памяти, если у вас будет большая база данных. Кроме того, любые изменения, которые вы вносите в базу данных, не будут сохранены на диск назад, если вы явно не сохраните их, используя команды ".save" или ".backup".

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

Опция --zip заставляет указанный входной файл интерпретироваться как архив ZIP вместо файла базы данных SQLite.

--hexdb заставляет читать содержание базы из последующих строк в шестнадцатеричном формате, а не от отдельного файла на диске. Инструмент командной строки "dbtotxt" может использоваться, чтобы произвести соответствующий текст для базы данных. --hexdb предназначается для использования разработчиками SQLite для тестирования. Мы не знаем ни о каких вариантах использования для этого выбора за пределами внутреннего тестирования SQLite и развития.

8. Перенаправление I/O

8.1. Запись результатов в файл

По умолчанию sqlite3 посылает результаты запроса в стандартный вывод. Можно изменить это использованием команд ".output" и ".once". Просто поместите название выходного файла как аргумент .output, и все последующие результаты запроса будут написаны в него. Или используйте команду .once вместо .output и вывод будет перенаправлен только для единственной следующей команды прежде, чем вернуться к консоли. Используйте .output без аргументов, чтобы снова начать писать на стандартный вывод. Например:

sqlite> .mode list
sqlite> .separator |
sqlite> .output test_file_1.txt
sqlite> select * from tbl1;
sqlite> .exit
$ cat test_file_1.txt
hello|10
goodbye|20
$

Если первый символ имени файла в ".output" или ".once" это символ вертикальной черты ("|"), оставшиеся символы рассматривают как команду, и вывод посылают в ту команду. Это облегчает перекачку результатов по трубопроводу запроса в некоторый другой процесс. Например, "open -f" на Mac открывает текстовый редактор, чтобы показать содержание, которое это читает от стандартного ввода. Таким образом, чтобы видеть результаты запроса в текстовом редакторе, можно было напечатать:

sqlite> .once | open -f
sqlite> SELECT * FROM bigTable;

Если у команд ".output" или ".once" есть аргумент "-e", вывод собран во временный файл, и системный текстовый редактор вызван на этот текстовый файл. Таким образом команда ".once -e" достигает того же самого результата как ".once '|open -f'", но с выгодой того, чтобы быть портативной через все системы.

Если у команд ".output" или ".once" есть аргумент "-x", он заставляет их накапливать вывод как Comma-Separated-Values (CSV) во временном файле, затем вызовать системную утилиту по умолчанию для просмотра файлов CSV (обычно программа электронной таблицы) на результате. Это - быстрый способ послать результат запроса электронной таблице для легкого просмотра:

sqlite> .once -x
sqlite> SELECT * FROM bigTable;

".excel" это псевдоним для ".once -x". Это делает точно то же самое.

8.2. Чтение SQL из файла

В интерактивном режиме sqlite3 читает входной текст (SQL-операторы или dot-команды) с клавиатуры. Можно также перенаправить вход от файла, когда вы начинаете sqlite3, конечно, но тогда у вас нет возможности взаимодействовать с программой. Иногда полезно управлять скриптом SQL, содержавшимся в файле, входящем в другие команды командной строки. Для этого обеспечивается команда ".read".

".read" берет отдельный аргумент, который (обычно) является названием файла, из которого можно прочитать входной текст.

sqlite> .read myscript.sql

".read" временно прекращает читать с клавиатуры и вместо этого берет свой ввод от названного файла. После достижения конца файла ввод возвращается назад на клавиатуру. Файл скрипта может содержать точечные команды, точно так же, как обычный интерактивный ввод.

Если аргумент ".read" начинается с символа "|", то вместо того, чтобы открыть аргумент как файл, это управляет аргументом (без символа "|") как командой с использованием вывода той команды как ввода. Таким образом, если у вас есть скрипт, который производит SQL, можно выполнить этот SQL непосредственно, используя команду:

sqlite> .read |myscript.bat

8.3. Функции файлового

Оболочка командной строки добавляет две определенные приложением функции SQL, которые облегчают чтение файла в столбец таблицы и написание содержания колонки в файл, соответственно.

readfile(X) читает все содержание файла, названного X, и возвращает это содержание как BLOB. Это может использоваться, чтобы загрузить содержание в таблицу. Например:

sqlite> CREATE TABLE images(name TEXT, type TEXT, img BLOB);
sqlite> INSERT INTO images(name,type,img)
   ...>   VALUES('icon','jpeg',readfile('icon.jpg'));

writefile(X,Y) пишет blob Y в файл X и возвращает число записанных байтов. Используйте эту функцию, чтобы извлечь содержание единственного столбца таблицы в файл. Например:

sqlite> SELECT writefile('icon.jpg',img) FROM images WHERE name='icon';

Обратите внимание на то, что функции readfile(X) и writefile(X,Y) это дополнительные функции и не встроены в основную библиотеку SQLite. Этот установленный порядок доступен как загружаемое расширение в исходном файле ext/misc/fileio.c.

8.4. SQL-функция edit()

У CLI есть другая встроенная названная функция SQL edit(). Edit() берет один или два аргумента. Первый аргумент, значение, часто большая многострочная последовательность, которая будет отредактирована. Второй аргумент это вызов для текстового редактора. Это может включать варианты затронуть поведение редактора. Если второй аргумент опущен, переменная окружения VISUAL используется. Функция edit() пишет свой первый аргумент во временный файл, вызывает редактор на временный файл, перечитывает файл назад в память после того, как редактор завершится, затем возвращает отредактированный текст.

edit() может использоваться, чтобы внести изменения в значения крупного текста. Например:

sqlite> UPDATE docs SET body=edit(body) WHERE name='report-15';

В этом примере содержание поля docs.body для входа, где docs.name это "report-15", пошлют редактору. После того, как редактор завершится, результат будет написан назад в поле docs.body.

Операция по умолчанию edit() должна вызвать текстовый редактор. Но при помощи альтернативной программы редактирования во втором аргументе можно также заставить его редактировать изображения или другие нетекстовые ресурсы. Например, если вы хотите изменить изображение JPEG, которое сохранено в поле таблицы, вы могли бы:

sqlite> UPDATE pics SET img=edit(img,'gimp') WHERE id='pic-1542';

Программа может также использоваться в качестве смотрелки, просто игнорируя возвращаемое значение. Например, чтобы просто посмотреть на изображение выше, вы могли бы:

sqlite> SELECT length(edit(img,'gimp')) WHERE id='pic-1542';

8.5. Импортирование файлов как CSV или другие форматы

Примените команду ".import", чтобы импортировать CSV CSV (comma separated value) или так же разграниченные данные в таблицу SQLite. Команда ".import" берет два аргумента, которые являются источником, из которого данные должны быть прочитаны, и названием таблицы SQLite, в которую должны быть вставлены данные. Исходный аргумент задает название файла, который будет прочитан, или если это начинается с символа "|", это определяет команду, которой будут управлять, чтобы произвести входные данные.

Обратите внимание на то, что может быть важно установить "mode" прежде, чем управлять командой ".import". Это должно препятствовать тому, чтобы оболочка командной строки пыталась интерпретировать входной текст файла как некоторый формат кроме того, как файл структурирован. Если использована опция --csv или --ascii, они управляют входными разделителями импорта. Иначе разделители те, которые заданы для режима текущей производительности.

Чтобы импортировать в таблицу не в схеме "main", опция --schema может использоваться, чтобы определить, что таблица находится в некоторой другой схеме. Это может быть полезно для баз данных ATTACH или чтобы импортировать в таблицу TEMP.

Когда .import работает, ее обработка первой входной строки зависит от того, существует ли целевая таблица. Если это не существует, таблица автоматически составлена, и содержание первой входной строки используется, чтобы определить имя всех колонок в таблице. В этом случае содержание данных таблицы взято от второй и последующих входных строк. Если целевая таблица уже существует, каждая строка входа, включая первую, взята, чтобы быть фактическим содержанием данных. Если входной файл содержит начальную строку этикеток колонки, можно сделать пропуск команды .import, используя опцию "--skip 1".

Вот использование в качестве примера, загружая существующую ранее временную таблицу из файла CSV, у которого есть имена столбцов в первой строке:

sqlite> .import --csv --skip 1 --schema temp C:/work/somedata.csv tab1

При чтении в режимах кроме 'ascii', ".import" интерпретирует ввод как записи, состоявшие из полей, согласно спецификации RFC 4180 за этим исключением: входные разделители записей и разделители полей как установлены режимом или при помощи команды .separator. Поля всегда подвергаются удалению символов цитирования, чтобы полностью изменить цитирование, сделанное по RFC 4180, кроме режима ASCII.

Чтобы импортировать данные с произвольными разделителями и без цитирования, сначала установите режим ASCII (".mode ascii"), затем установите разделители, используя команду ".separator". При выполнении ".import" данные будут разделены на поля и записи согласно указанным разделителям.

8.6. Экспорт в CSV

Чтобы экспортировать таблицу SQLite (или часть таблицы) как CSV, просто установите "mode" = "csv" и затем управляйте запросом, чтобы извлечь желаемые строки таблицы. Вывод будет отформатирован как CSV по RFC 4180.

sqlite> .headers on
sqlite> .mode csv
sqlite> .once c:/work/dataout.csv
sqlite> SELECT * FROM tab1;
sqlite> .system c:/work/dataout.csv

В примере выше ".headers on" заставляет указать этикетки колонки как первая строка вывода. Это означает, что первая строка получающегося файла CSV будет содержать этикетки колонки. Если этикетки колонки не нужны, установите ".headers off". ".headers off" задано по умолчанию и может быть опущен, если заголовки не были ранее включены.

".once FILENAME" заставляет весь вывод запроса направить в названный файл вместо консоли. В примере выше, та строка заставляет содержание CSV быть написанным в файл, названный "C:/work/dataout.csv".

Заключительная строка примера (".system c:/work/dataout.csv") имеет тот же самый эффект как двойной клик по файлу c:/work/dataout.csv в windows. Это будет, как правило, запускать программу электронной таблицы, чтобы показать файл CSV.

Эта команда работает только в Windows. Эквивалентная строка на Mac была бы:

sqlite> .system open dataout.csv

В Linux и других unix необходимо будет нечто вроде:

sqlite> .system xdg-open dataout.csv

8.6.1. Экспорт в Excel

Чтобы упростить экспорт в электронную таблицу, CLI обеспечивает команду ".excel", которая захватывает вывод единого запроса и посылает его в программу электронной таблицы по умолчанию на компьютере. Используйте его:

sqlite> .excel
sqlite> SELECT * FROM tab;

Команда выше пишет вывод запроса как CSV во временный файл, вызывает обработчик по умолчанию для файлов CSV (обычно предпочтительная программа электронной таблицы, такая как Excel или LibreOffice), затем удаляет временный файл. Это по существу метод выполнения последовательности ".csv", ".once" и ".system".

".excel" это псевдоним для ".once -x". Опция -x в .once пишет результаты как CSV во временный файл, который вызывают с суффиксом ".csv", затем вызывает обработчик по умолчанию систем для файлов CSV.

Есть также ".once -e", которая работает точно так же за исключением того, что она называет временный файл с суффиксом ".txt" так, чтобы текстовый редактор по умолчанию для системы был вызван вместо электронной таблицы по умолчанию.

8.6.2. Экспорт в TSV

Экспорт в чистый TSV, без любого полевого цитирования, может быть сделан через ".mode tabs" прежде, чем управлять запросом. Однако, вывод не будет прочитана правильно в режиме tabs командой ".import", если это будет содержать знаки двойной кавычки. Чтобы получить TSV, цитированный по RFC 4180, так, чтобы это могло быть введено в режиме tabs в ".import", сначала введите ".mode csv", затем '.separator "\t"', потом выполните запрос.

9. Доступ к архивам ZIP как файлам базы данных

В дополнение к чтению и написанию файлов базы данных SQLite sqlite3 также читает и пишет архивы ZIP. Просто определите имя файла ZIP вместо имени файла базы данных SQLite в командной строке или в команде ".open", и sqlite3 автоматически обнаружит, что файл это архив ZIP вместо базы данных SQLite и откроет его как таковой. Это работает независимо от суффикса файла. Таким образом, можно открыть файлы JAR, DOCX, ODP и любой другой формат файла, который является действительно архивом ZIP, SQLite прочитает его для вас.

Архив ZIP выглядит как база данных, содержащая единственную таблицу со следующей схемой:

CREATE TABLE zip(
  name,     // Name of the file
  mode,     // Unix-style file permissions
  mtime,    // Timestamp, seconds since 1970
  sz,       // File size after decompression
  rawdata,  // Raw compressed file data
  data,     // Uncompressed file content
  method    // ZIP compression method code
);

Так, например, если бы вы хотели видеть эффективность сжатия (выраженную как размер сжатого содержания относительно оригинального несжатого размера файла) для всех файлов в архиве ZIP, сортированном от самого сжатого до наименее сжатого, вы могли бы:

sqlite> SELECT name, (100.0*length(rawdata))/sz FROM zip ORDER BY 2;

Или используйте функции файлового I/O, чтобы извлечь элементы архива ZIP:

sqlite> SELECT writefile(name,content) FROM zip
   ...> WHERE name LIKE 'docProps/%';

9.1. Как доступ к архиву ZIP осуществляется

Оболочка командной строки использует виртуальную таблицу Zipfile, чтобы получить доступ к архивам ZIP. Вы видите это, управляя командой ".schema", когда архив ZIP открыт:

sqlite> .schema
CREATE VIRTUAL TABLE zip USING zipfile('document.docx')
/* zip(name,mode,mtime,sz,rawdata,data,method) */;

Открывая файл, если клиент командной строки обнаруживает, что файл это архив ZIP вместо базы данных SQLite, это на самом деле открывает базу данных в памяти и затем в этой базе данных в памяти это создает экземпляр виртуальной таблицы Zipfile, который присоединен к архиву ZIP.

Специальная обработка для открытия архивов ZIP является уловкой оболочки командной строки, не основной библиотеки SQLite. Таким образом, если вы захотите открыть архив ZIP как базу данных в вашем запросе, необходимо будет активировать модуль виртуальной таблицы соответствующим запросом CREATE VIRTUAL TABLE.

10. Преобразование всей базы данных к текстовому файлу

Используйте команду ".dump", чтобы преобразовать все содержание базы данных в единственный текстовый файл UTF-8. Этот файл может быть преобразован назад в базу данных, перекачав его по трубопроводу назад в sqlite3.

Хороший способ сделать архивную копию базы данных:

$ sqlite3 ex1 .dump | gzip -c >ex1.dump.gz

Это производит файл ex1.dump.gz, который содержит все, что необходимо, чтобы восстановить базу данных в более позднее время или на другой машине. Чтобы восстановить базу данных:

$ zcat ex1.dump.gz | sqlite3 ex2

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

$ createdb ex2
$ sqlite3 ex1 .dump | psql ex2

11. Восстановление данных из испорченной базы данных

Подобно ".dump", команда ".recover" пытается преобразовать все содержание файла базы данных к тексту. Различие в том, что вместо того, чтобы читать данные, используя нормальный интерфейс базы данных SQL, ".recover" пытается повторно собрать базу данных на основе данных, извлеченных непосредственно из как можно большего количества страниц базы данных. Если база данных повреждена, ".recover" обычно в состоянии возвратить данные из всех неиспорченных частей базы данных, тогда как ".dump" останавливается, когда сталкивается с первым признаком повреждения.

Если команда ".recover" возвращает одну или несколько строк, которые она не может приписать никакой таблице базы данных, скрипт вывода составляет таблицу "lost_and_found", чтобы сохранить такие строки. Схема таблицы lost_and_found:

CREATE TABLE lost_and_found(
    rootpgno INTEGER,             -- root page of tree pgno is a part of
    pgno INTEGER,                 -- page number row was found on
    nfield INTEGER,               -- number of fields in row
    id INTEGER,                   -- value of rowid field, or NULL
    c0, c1, c2, c3...             -- columns for fields of row
);

Таблица "lost_and_found" содержит одну строку для каждой найденной строки, восстановленной от базы данных. Кроме того, есть одна строка для каждого восстановленного элемента индекса, который не может быть приписан никакому индексу SQL. Это вызвано тем, что в базе данных SQLite тот же самый формат используется, чтобы сохранить элементы индекса SQL и записи таблицы WITHOUT ROWID.

Столбец Содержимое
rootpgnoДаже при том, что может быть невозможно приписать строку определенной таблице базы данных, это может быть частью древовидной структуры в файле базы данных. В этом случае номер страницы корня той древовидной структуры сохранен в этой колонке. Или, если страница, на которой была найдена строка, не является частью древовидной структуры, эта колонка хранит копию значения в колонке "pgno", номер страницы страницы, на которой была найдена строка. Во многих, хотя не во всех, случаях все строки в таблице lost_and_found с тем же самым значением в этой колонке принадлежат той же самой таблице.
pgno Номер страницы, на которой была найдена эта строка.
nfield Количество полей в этой строке.
id Если строка прибывает из таблицы WITHOUT ROWID, эта колонка содержит NULL. Иначе это содержит 64-битное целое число rowid для строки.
c0, c1, c2...Значения для каждой колонки строки сохранены в этих колонках. Команда ".recover" составляет таблицу lost_and_found со столькими же колонками, как требуется самой длинной найденной строкой.

Если восстановленная схема базы данных уже содержит таблицу "lost_and_found", ".recover" использует имя "lost_and_found0", "lost_and_found1" и т.д. Имя по умолчанию "lost_and_found" может быть отвергнуто, вызвав ".recover" с опцией --lost-and-found. Например, чтобы скрипт вывел данные в таблицу "orphaned_rows":

sqlite> .recover --lost-and-found orphaned_rows

12. Загрузка расширений

Можно добавить новые определенные пользовательским приложением функции SQL, сопоставления последовательностей, виртуальные таблицы и VFS в оболочке командной строки во время выполнения, используя команду ".load". Во-первых, постройте расширение как DLL или общую библиотеку (как описано здесь):, затем:

sqlite> .load /path/to/my_extension

p>Обратите внимание на то, что SQLite автоматически добавляет соответствующий дополнительный суффикс (".dll" в windows, ".dylib" в Mac, ".so" на большинстве unix) к имени файла. Обычно хорошая идея определить полный путь расширения.

SQLite вычисляет точку входа для расширения на основе имени файла. Чтобы отвергнуть этот выбор, просто добавьте название расширения как второй аргумент команде ".load".

Исходный код для нескольких полезных расширений может быть найден в подкаталоге ext/misc исходных текстов SQLite. Можно использовать эти расширения как есть или как основание для создания собственных расширений, чтобы соответствовать собственным конкретным потребностям.

13. Хэши содержания базы данных

".sha3sum" вычисляет хэш SHA3 содержания БД. Хэш вычисляется по содержанию базы данных, не ее представлению на диске. Это означает, например, что VACUUM или подобное сохраняющее данные преобразование не изменяет хэш.

".sha3sum" понимает опции "--sha3-224", "--sha3-256", "--sha3-384" и "--sha3-512", чтобы определить который вариант SHA3 использовать для хэша. По умолчанию SHA3-256.

Схема базы данных (в таблице sqlite_schema) обычно не включается в хэш, но может быть добавлена опцией "--schema".

".sha3sum" берет единственный дополнительный аргумент, который является образцом для LIKE. Если этот выбор будет существовать, то только таблицы, имена которых соответствуют образцу LIKE, хэшированы.

".sha3sum" осуществляется с помощью функции расширения "sha3_query()".

14. Самотестирование содержания базы данных

".selftest" пытается проверить, что база данных не повреждена. Команда .selftest ищет таблицу в схеме "selftest", определенную следующим образом:

CREATE TABLE selftest(
  tno INTEGER PRIMARY KEY,  -- Test number
  op TEXT,                  -- 'run' or 'memo'
  cmd TEXT,                 -- SQL command to run, or text of "memo"
  ans TEXT                  -- Expected result of the SQL command
);

.selftest читает строки таблицы самопроверки в порядке selftest.tno. Для каждой строки 'memo' это пишет текст в 'cmd' в вывод. Для каждой строки 'run' это выполнит текст 'cmd' как SQL, сравнивает результат со значением в 'ans' и показывает сообщение об ошибке, если результаты отличаются.

Если нет никакого таблицы самопроверки, команда ".selftest" выполнит PRAGMA integrity_check.

".selftest --init" составляет таблицу самопроверки, если это еще не существует, затем прилагает записи, которые проверяют хэш SHA3 содержания всех таблиц. Последующие запуски ".selftest" проверят, что база данных не была изменена ни в каком случае. Чтобы произвести тесты, чтобы проверить, что подмножество таблиц неизменно, просто выполните ".selftest --init", затем DELETE строки самопроверки, которые относятся к таблицам, которые не являются постоянными.

15. Поддержка архива SQLite

".archive" и параметр командной строки "-A" оказывают встроенную поддержку для формата архивов SQLite. Интерфейс подобен команде "tar" в unix. Каждый вызов команды ".ar" должен определить единственную опцию команды. Следующие команды доступны для ".archive":

Опция Длинная опцияСмысл
-c --createСоздайте новый архив, содержащий определенные файлы.
-x--extract Извлеките определенные файлы из архива.
-i --insertДобавьте файлы к существующему архиву.
-r--remove Удалите файлы из архива.
-t --listПеречислите файлы в архиве.
-u--update Добавьте файлы к существующему архиву, если они изменились.

Каждый вызов может определить один или несколько вариантов модификатора. Некоторые варианты модификатора требуют аргумент. Следующие варианты модификатора доступны:

Опция Длинная опцияСмысл
-v --verboseПеречислите каждый файл.
-f FILE--file FILE Если определено, используйте файл FILE в качестве архива. Иначе предположите, что текущая "main" БД и есть архив.
-a FILE --append FILEАналог --file, используйте файл FILE в качестве архива, но откройте файл, используя apndvfs VFS так, чтобы архив был добавлен до конца FILE, если FILE уже будет существовать.
-C DIR--directory DIR Если определено, интерпретируйте все относительные пути относительно DIR вместо текущего рабочего каталога.
-g --globИспользовать glob( Y,X), чтобы соответствовать аргументам имен в архиве.
-n--dryrun Показать SQL, которым управляли бы, чтобы выполнить операцию архивирования, но ничего на самом деле не менять.
---- Все последующие слова командной строки это аргументы команды, не опции.

Для использования командной строки добавьте короткие параметры командной строки немедленно после "-A" без пробела. Все последующие аргументы считаются частью команды .archive. Например, следующие команды эквивалентны:

sqlite3 new_archive.db -Acv file1 file2 file3
sqlite3 new_archive.db ".ar -cv file1 file2 file3"

Могут быть смешаны длинные и короткие параметры. Например, следующее эквивалентно:

-- Two ways to create a new archive named "new_archive.db" containing
-- files "file1", "file2" and "file3".
.ar -c --file new_archive.db file1 file2 file3
.ar -f new_archive.db --create file1 file2 file3

Альтернативно, первым аргументом после ".ar" может быть связь краткой формы всех необходимых вариантов (без символов "-"). В этом случае аргументы в пользу вариантов, требующих их, прочитаны из командной строки, а любые остающиеся слова считают аргументами команды. Например:

-- Create a new archive "new_archive.db" containing files "file1" and
-- "file2" from directory "dir1".
.ar cCf dir1 new_archive.db file1 file2 file3

15.1. Создание архива SQLite

Создайте новый архив, переписав любой существующий архив (в текущей "main" БД или в файле, определенном опцией --file). Каждый аргумент после опций это файл, чтобы добавить к архиву. Каталоги импортируются рекурсивно. Посмотрите выше для примеров.

15.2. Распаковка архивов SQLite

Файлы извлекаются из архива (в текущий рабочий каталог или каталог, определенный опцией --directory). Извлечены файлы или каталоги, имена которых соответствуют аргументам, как указано опцией --glob. Или, если никакие аргументы не следуют за опциями, все файлы и каталоги извлечены. Любые указанные каталоги извлечены рекурсивно. Ошибка, если какие-либо указанные имена или образцы не могут быть найдены в архиве.

-- Extract all files from the archive in the current "main" db to the
-- current working directory. List files as they are extracted. 
.ar --extract --verbose
-- Extract file "file1" from archive "ar.db" to directory "dir1".
.ar fCx ar.db dir1 file1
-- Extract files with ".h" extension to directory "headers".
.ar -gCx headers *.h

15.3. Просмотр архива SQLite

Перечислите содержание архива. Если никакие аргументы не определяются, то все файлы перечисляются. Иначе только те, которые соответствуют аргументам. В настоящее время опция --verbose не изменяет поведение этой команды. Это может измениться в будущем.

-- List contents of archive in current "main" db..
.ar --list

15.4. SQLite-архив Insert и Update

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

Для команды --insert все перечисленные файлы вставляются в архив. Для команды --update вставляются файлы, если они ранее не существуют в архиве или если их "mtime" или "mode" отличаются от того, что в настоящее время находится в архиве.

Узел совместимости: До версии SQLite version 3.28.0 (2019-04-16) только --update поддерживалась, но работала как --insert, то есть это всегда повторно вставляло каждый файл независимо от того, изменился ли он.

15.5. Удаление архива SQLite

--remove удаляет файлы и каталоги, которые соответствуют обеспеченным аргументам (если таковые имеются). Ошибка обеспечить аргументы, которые ничему не соответствуют в архиве.

15.6. Работа с ZIP-архивами

Если FILE это архив ZIP вместо архиват SQLite, команда ".archive" и параметр командной строки "-A" все еще работают. Это достигается, используя расширение zipfile. Следовательно, следующие команды примерно эквивалентны, отличаясь только по форматированию вывода:

Традиционная командаЭквивалент sqlite3.exe
unzip archive.zip sqlite3 -Axf archive.zip
unzip -l archive.zip sqlite3 -Atvf archive.zip
zip -r archive2.zip dirsqlite3 -Acf archive2.zip dir

15.7. SQL, используемый, чтобы осуществить операции архивирования SQLite

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

Чтобы видеть, какие SQL-операторы используются, чтобы осуществить операцию архивирования SQLite, добавьте опцию --dryrun или -n. Это заставляет показать SQL, но запрещает выполнение SQL.

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

  1. fileio.c — Это расширение добавляет функции SQL readfile() и writefile() для чтения и записи содержания файлов на диске. fileio.c также включает табличную функцию fsdir() для листинга содержания каталога и функцию lsmode() для преобразования числовых st_mode integers из системного вызова stat() в человекочитаемые последовательности в манере команды "ls -l".

  2. sqlar.c — Это расширение добавляет функции sqlar_compress() и sqlar_uncompress(), которые необходимы, чтобы сжать и распаковать содержание файла, когда это вставлено и извлечено из архива SQLite.

  3. zipfile.c — Это расширение осуществляет табличную функцию "zipfile(FILE)", которая используется, чтобы прочитать архивы ZIP. Это расширение необходимо только читая архивы ZIP вместо архивов SQLite.

  4. appendvfs.c — Это расширение осуществляет новый VFS, который позволяет базе данных SQLite добавиться к некоторому другому файлу, такому как исполняемый файл. Это расширение необходимо только если использована опция --append.

16. Параметры SQL

SQLite позволяет привязывать параметры в SQL-операторе где угодно, где позволено литеральное значение. Значения для этих параметров установлены, используя sqlite3_bind_...() API.

Параметры могут быть именованными и неименованными. Неназванный параметр это единственный вопросительный знак ("?"). Названные параметры это "?" с числом (например: "?15" или "?123") или один из знаков "$", ":" или "@", сопровождаемый алфавитно-цифровым именем (например: "$var1", ":xyz", "@bingo").

Оболочка командной строки оставляет неназванные параметры несвязанными, означая, что у них будет значение SQL NULL, но названным параметрам можно было бы назначить значения. Существует таблица TEMP, названная "sqlite_parameters" со схемой:

CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value) WITHOUT ROWID;

Если есть вход в той таблице, где столбец ключа точно соответствует названию параметра (включая начальный символ "?", "$", ":" или "@"), тогда параметру назначают значение столбца значений. Если никакой вход не существует, параметр по умолчанию NULL.

".parameter" существует, чтобы упростить управление этой таблицей. ".parameter init" (часто сокращаемая как просто ".param init") составляет таблицу temp.sqlite_parameters, если это еще не существует. ".param list" показывает все записи в temp.sqlite_parameters. ".param clear" удаляет таблицу temp.sqlite_parameters. ".param set KEY VALUE" и ".param unset KEY" создают или удаляют записи из таблицы temp.sqlite_parameters.

VALUE, переданное ".param set KEY VALUE" может быть литералом SQL, любым другим SQL-выражением или запросом, который может быть оценен, чтобы привести к значению. Это позволяет значениям отличающихся типов быть установленными. Если такая оценка терпит неудачу, обеспеченный VALUE вместо этого указан и вставлен как текст. Поскольку такая начальная оценка может и не потерпеть неудачу в зависимости от содержания VALUE, надежный режим получить текстовое значение VALUE состоит в том, чтобы добавить его в одинарных кавычках, защищенных от вышеописанного парсинга хвоста команды. Например, (чтобы не получить значение -1365):

.parameter init
.parameter set @phoneNumber "'202-456-1111'"

Обратите внимание на то, что двойные кавычки служат, чтобы экранировать одинарные кавычки и гарантировать, что процитированный текст размечен как один аргумент.

Таблица temp.sqlite_parameters предоставляет только значения для параметров оболочке командной строки. Таблица temp.sqlite_parameter не имеет никакого эффекта на запросы, которыми управляют непосредственно, используя язык C SQLite API. Отдельные приложения, как ожидают, осуществят свою собственную привязку параметров. Можно искать "sqlite_parameters" в исходном коде оболочки командной строки, чтобы видеть, как она делает привязку параметров.

17. Рекомендации индекса (эксперт SQLite)

Примечание: Эта команда экспериментальна. Это может быть удалено, или интерфейс изменится в какой-то момент в будущем.

Для большинства нетривиальных баз данных SQL ключ к работе это создать правильные индексы SQL. В этом контексте "правильные индексы SQL" означает те, которые позволяют быстро оптимизировать запросы. Команда ".expert" может помочь с этим, предложив индексы, которые могли бы помочь с определенными запросами.

".expert" дается сначала и сопровождается SQL-запросом на отдельной строке. Например, рассмотрите следующую сессию:

sqlite> CREATE TABLE x1(a, b, c);
-- Create table in database 
sqlite> .expert
sqlite> SELECT * FROM x1 WHERE a=? AND b>?;
-- Analyze this SELECT 
CREATE INDEX x1_idx_000123a7 ON x1(a, b);
0|0|0|SEARCH TABLE x1 USING INDEX x1_idx_000123a7 (a=? AND b>?)
sqlite> CREATE INDEX x1ab ON x1(a, b);
-- Create the recommended index 
sqlite> .expert
sqlite> SELECT * FROM x1 WHERE a=? AND b>?;
-- Re-analyze the same SELECT 
(no new indexes)
0|0|0|SEARCH TABLE x1 USING INDEX x1ab (a=? AND b>?)

В вышеупомянутом пользователь создает схему базы данных (единственная таблица "x1"), затем использует команду ".expert", чтобы проанализировать запрос, в этом случае "SELECT * FROM x1 WHERE a=? AND b>?". Инструмент оболочки рекомендует, чтобы пользователь создал новый индекс (индекс "x1_idx_000123a7"), и производит план, что запрос использовал бы в формате EXPLAIN QUERY PLAN. Пользователь тогда создает индекс с эквивалентной схемой и управляет анализом того же самого запроса снова. На этот раз инструмент оболочки не рекомендует новых индексов и производит план, который SQLite будет использовать для запроса.

".expert" принимает следующие опции:

ОпцииСмысл
‑‑verboseЕсли существует, производит более детальный отчет для каждого проанализированного запроса.
‑‑sample PERCENT По умолчанию 0, предписывает команде ".expert" рекомендовать индексы на основе запроса и одной только схемы базы данных. Это подобно режиму, которым планировщик запроса SQLite выбирает индексы для запросов, если пользователь не управлял командой ANALYZE на базе данных, чтобы произвести статистику распределения данных.
Если этот выбор имеет аргумент отличный от нуля, команда ".expert" производит подобную статистику распределения данных для всех индексов, которые рассматривают на основе PERCENT процентов строк, в настоящее время хранившихся в каждой таблице базы данных. Для баз данных с необычными распределениями данных это может привести к лучшим рекомендациям индекса, особенно если приложение намеревается выполнить ANALYZE.
Для маленьких баз данных и современных CPU обычно нет никакой причины не использовать "--sample 100". Однако сбор статистики распределения данных может быть дорогим для больших таблиц базы данных. Если операция слишком медленная, попытайтесь передать меньшее значение для --sample.

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

Схема базы данных, которая включает свои функции SQL, сделанные доступными с помощью механизма загрузки дополнений, возможно, потребует специальное решение, чтобы работать с особенностью .expert. Поскольку особенность использует дополнительные связи, чтобы осуществить ее функциональность, те функции должны быть сделаны доступными для тех дополнительных связей. Это может быть сделано посредством дополнительных вариантов загрузки/использования, описанных здесь и здесь.

18. Работа с многими соединениями с базой данных

Начиная с version 3.37.0 (2021-11-27), CLI может обработать несколько соединений с базой данных открытых сразу. Только одно соединение с базой данных активно за один раз. Бездействующие связи все еще открыты, но не работают.

Используйте ".connection" (краткая форма ".conn"), чтобы видеть список соединений с базой данных и то, которое в настоящее время активно. Каждое соединение с базой данных определяется целым числом между 0 и 9. Может быть самое большее 10 одновременно открытых связей. Изменяются на другое соединение с базой данных, создавая его, если это еще не существует, печатая команду ".conn", сопровождаемую числом. Закройте соединение с базой данных, печатая ".conn close N", где N номер связи.

Хотя основные соединения с базой данных SQLite абсолютно независимы друг от друга, многих параметров настройки CLI, таковы как выходной формат, разделяются через все соединения с базой данных. Таким образом изменение режима вывода в одной связи изменит его во всех. С другой стороны, некоторые команды, например, .open, затрагивают только текущую связь.

19. Разные дополнительные особенности

CLI строится с несколькими расширениями SQLite, которые не включены в библиотеку SQLite. Некоторые добавляют опции, не описанные в предыдущих секциях, а именно:

  • Сопоставление UINT упорядочивает, как рассматривать unsigned integers, включенные в текст согласно их значению, наряду с другим текстом.
  • Десятичная система исчисления в соответствии с decimal extension.
  • Табличная функция generate_series().
  • Функции base64() и base85(), которые кодируют blob в текст base64 или base85 (или расшифровывают то же самое в blob).
  • Поддержка расширенных регулярных выражений POSIX, связанных с оператором REGEXP.

20. Другие команды

Есть много других точечных команд, доступных в оболочке командной строки. Посмотрите команду ".help" для полного списка для какой-то конкретной версии SQLite.

21. sqlite3 в скриптах оболочки

Один режим использовать sqlite3 в скриптах оболочки состоит в том, чтобы использовать "echo" или "cat", чтобы произвести последовательность команд в файле, затем вызвать sqlite3 в то время как вход перенаправлен от произведенного командного файла. Это хорошо работает при многих обстоятельствах. Но как добавленное удобство, sqlite3 позволяет единственной команде SQL быть введенной в командную строку как второй аргумент после имени базы данных. Когда программа sqlite3 начата с двумя аргументами, второй аргумент передается в библиотеку SQLite для обработки, результаты запроса печатаются на стандартном выводе в режиме списка. Этот механизм разработан, чтобы сделать sqlite3 простым в использовании вместе с такими программами, как "awk". Например:

$ sqlite3 ex1 'select * from tbl1' \
>  | awk '{printf "<tr><td>%s<td>%s\n",$1,$2 }'
<tr><td>hello<td>10
<tr><td>goodbye<td>20
$

22. Маркировка конца SQL-оператора

Команды SQLite обычно заканчиваются точкой с запятой. В CLI можно также использовать слово "GO" (нечувствительно к регистру) или символ "/" в отдельной строке, чтобы закончить команду. Они используются SQL Server и Oracle, соответственно, и поддерживаются SQLite CLI для совместимости. Они не будут работать в sqlite3_exec(), потому что CLI переводит эти записи в точку с запятой перед передачей их в ядро SQLite.

23. Параметры командной строки

Есть много параметров командной строки, доступных CLI. Используйте --help, чтобы видеть список:

$ sqlite3 --help
Usage: ./sqlite3 [OPTIONS] FILENAME [SQL]
FILENAME is the name of an SQLite database. A new database is created
if the file does not previously exist.
OPTIONS include:
   -A ARGS...           run ".archive ARGS" and exit
   -append              append the database to the end of the file
   -ascii               set output mode to 'ascii'
   -bail                stop after hitting an error
   -batch               force batch I/O
   -box                 set output mode to 'box'
   -column              set output mode to 'column'
   -cmd COMMAND         run "COMMAND" before reading stdin
   -csv                 set output mode to 'csv'
   -deserialize         open the database using sqlite3_deserialize()
   -echo                print commands before execution
   -init FILENAME       read/process named file
   -[no]header          turn headers on or off
   -help                show this message
   -html                set output mode to HTML
   -interactive         force interactive I/O
   -json                set output mode to 'json'
   -line                set output mode to 'line'
   -list                set output mode to 'list'
   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory
   -markdown            set output mode to 'markdown'
   -maxsize N           maximum size for a --deserialize database
   -memtrace            trace all memory allocations and deallocations
   -mmap N              default mmap size set to N
   -newline SEP         set output row separator. Default: '\n'
   -nofollow            refuse to open symbolic links to database files
   -nonce STRING        set the safe-mode escape nonce
   -nullvalue TEXT      set text string for NULL values. Default ''
   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory
   -quote               set output mode to 'quote'
   -readonly            open the database read-only
   -safe                enable safe-mode
   -separator SEP       set output column separator. Default: '|'
   -stats               print memory stats before each finalize
   -table               set output mode to 'table'
   -tabs                set output mode to 'tabs'
   -no-utf8             do not setup for console I/O using UTF-8
   -version             show SQLite version
   -vfs NAME            use NAME as the default VFS
   -zip                 open the file as a ZIP Archive

CLI гибок относительно форматирования параметра командной строки. Допустимы один или два символа "-". Таким образом, "-box" и "--box" означают то же самое. Параметры командной строки обрабатываются слева направо. Следовательно, "--box" отвергнет предшествующий "--quote".

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

23.1. Опция --safe

Опция --safe пытается отключить все опции CLI, которые могли бы вызвать любые изменения, кроме изменений определенного файла базы данных, названного в командной строке. Идея состоит в том, что, если вы получаете большой скрипт SQL от неизвестного или источника, которому не доверяют, можно управлять тем скриптом, чтобы спокойно увидеть, что это делает. Опция --safe отключает (среди прочего):

  • Команду .open, если --hexdb не используется или имя файла ":memory:". Это препятствует тому, чтобы скрипт читал или писал любые файлы базы данных, не названные в оригинальной командной строке.
  • SQL-команду ATTACH.
  • SQL-функции, у которых есть потенциально вредные побочные эффекты, например, edit(), fts3_tokenizer(), load_extension(), readfile() и writefile().
  • Команду .archive.
  • Команды .backup и .save.
  • Команду .import.
  • Команду .load.
  • Команду .log.
  • Команды .shell и .system.
  • Команды .excel, .once и .output.
  • Другие команды, у которых могут быть вредные побочные эффекты.

В основном любая опция CLI, которая читает или пишет что-то, кроме главного файла базы данных, отключена.

23.1.1. Обход ограничений --safe

Если опция "--nonce NONCE" будет также включен в командную строку для некоторой большой и произвольной последовательности NONCE, команда ".nonce NONCE" (с той же самой большой последовательностью) разрешит следующему SQL-оператору или точечной команде обходить ограничения --safe.

Предположим, что вы хотите управлять подозрительным скриптом, а он требует одну или две из особенностей, которые блокирует --safe. Например, предположите, что требуется ATTACH дополнительную БД. Или надо загрузить определенное расширение. Это может быть достигнуто, предшествуя ATTACH или ".load" соответствующей командой ".nonce" и поставляя значение, использованное в опции "--nonce" командной строки. Тем определенным командам тогда позволят выполняться, но все другие небезопасные команды будут все еще ограничены.

Использование ".nonce" опасно в том смысле, что ошибка может позволить враждебному скрипту повредить вашу систему. Поэтому используйте ".nonce" тщательно, экономно и как последнее прибежище когда не будет никаких других вариантов заставить скрипт работать в режиме --safe.

23.2. Опция --unsafe-testing

Опция --unsafe-testing поддерживает использование CLI для внутреннего тестирования библиотеки SQLite. Это не необходимо или не полезно для использования CLI для создания, изменения или запроса баз данных SQLite. Ее надлежащее использование должно разрешить тестирование по сценарию с прямыми изменениями схемы, и определенные недокументированные, ориентированные на тест точечные команды специального назначения.

Использование опции --unsafe-testing не будут обычно считать ошибкой только по этой причине. Поведение CLI с --unsafe-testing не поддерживается и не определяется.

23.3. Опция --no-utf8

В Windows, когда консоль используется для ввода или вывода, ее кодовые страницы ввода, вывода или обе обычно устанавливаются для I/O UTF-8 во время сессии. Это позволяет передавать содержание UTF-8 правильно.

Это консольный UTF-8 I/O не сделан, если CLI вызван с опцией --no-utf8 или если операционная система не поддерживает UTF-8 в консоли. В любом случае I/O переведен между внутренним кодированием UTF-8 CLI и кодировкой в действительности для консоли.

Во всех случаях неконсольный текстовый I/O кодируется в UTF-8.

Не в Windows этот выбор проигнорирован и невидим.

24. Компилирование sqlite3 программы из исходного кода

Чтобы собрать оболочку командной строки на системах Unix и Windows с MinGW, обычно используют команды:

sh configure; make

Это работает независимо от того, откуда вы собираете пакет. Есть немного зависимостей. Собирая из канонических источников, нужен tclsh. Используя связку объединения, вся работа предварительной обработки, обычно сделанная tclsh, будет уже выполнена, и нужны только общие сборочные утилиты.

Работа с библиотекой сжатия zlib необходима для команды .archive.

В Windows с MSVC используйте nmake с Makefile.msc:

nmake /f Makefile.msc

Для правильной работы команды .archive сделайте копию исходного кода zlib в подкаталог compat/zlib исходного дерева и соберите:

nmake /f Makefile.msc USE_ZLIB=1

24.1. Сборки Do-It-Yourself

Исходный код интерфейса командной строки sqlite3 находится в единственном файле, названном "shell.c". Файл shell.c произведен из других источников, но большая часть кода для shell.c находится в файле src/shell.c.in. Восстановите shell.c вводом "make shell.c" из канонического исходного дерева. Скомпилируйте shell.c (вместе с исходным кодом библиотеки sqlite3), чтобы произвести исполняемый файл. Например:

gcc -o sqlite3 shell.c sqlite3.c -ldl -lpthread -lz -lm

Следующие дополнительные варианты времени компиляции рекомендуются, чтобы обеспечить полнофункциональную оболочку командной строки: