Некоторые интересные вещи из SQLite
Строгие таблицы
Для тех, кто не знает, SQLite — это как динамически-типизированный язык. В нем нет ограничений на то, что можно и что нельзя хранить в столбце.
Это означает, что если в таблице базы данных есть столбец INTEGER
, ничто не мешает хранить в нём строку.
Именно в этом случае в дело вступают строгие таблицы. Вы можете включить «строгий режим» при создании таблицы, добавив ключевое слово strict
к определению таблицы.
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
email TEXT,
age REAL
) strict;
Теперь все вставки будут проверяться на тип, что предотвратит вставку недопустимых типов данных в столбцы.
.import
Вам когда-нибудь требовалось импортировать CSV-файл в базу данных, но не хотелось возиться с написанием сценария импорта? SQLite в этом поможет!
Если вы откроете свою базу данных в интерфейсе командной строки SQLite, то сможете воспользоваться командой .import
, чтобы импортировать CSV-файл непосредственно в таблицу базы данных.
sqlite> .import --csv /Users/ryan/Downloads/users.csv users
Это импортирует файл users.csv
в таблицу users
.
Расширения
Многие движки баз данных имеют некий API расширения, позволяющий добавлять новую функциональность в базу данных, не прибегая к ручной настройке.
SQLite не является исключением. Всё, что вам нужно сделать, — это найти расширение, которое хотите использовать, и загрузить объектный файл для вашей операционной системы.
Если не хотите возиться с загрузкой файлов, есть отличный менеджер пакетов
sqlpkg
, который позаботится о скучных вещах: https://github.com/nalgeon/sqlpkg-cli.
Если используется интерфейс командной строки для SQLite, то можно загрузить расширение с помощью команды .load
.
sqlite> .load /Users/ryan/Downloads/uuid
sqlite> select uuid4();
Если требуется расширение для выполнения какой-либо задачи, попробуйте поискать его на https://sqlpkg.org!
Байткод
Большинство SQL-движков преобразуют SQL-запросы в некое внутреннее представление. Обычно это дерево узлов, описывающих выполняемые действия, и SQL-движок использует это дерево для выполнения операций.
В этом отношении SQLite действительно отличается. Вместо использования дерева для обработки выражений он преобразует всё в более плоскую последовательность инструкций, байткодов.
Это очень похоже на то, как выполняются интерпретируемые языки программирования, такие как PHP, JavaScript, Ruby и т. д.
Вы можете просмотреть байткод, генерируемый при добавлении EXPLAIN
к SQL-запросам в интерфейсе командной строки!
sqlite> explain select * from users;
addr opcode p1 p2 p3 p4 p5 comment
---- ------------- ---- ---- ---- ------------- -- -------------
0 Init 0 8 0 0 Start at 8
1 OpenRead 0 2 0 2 0 root=2 iDb=0; users
2 Rewind 0 7 0 0
3 Rowid 0 1 0 0 r[1]=users.rowid
4 Column 0 1 2 0 r[2]= cursor 0 column 1
5 ResultRow 1 2 0 0 output=r[1..2]
6 Next 0 3 0 1
7 Halt 0 0 0 0
8 Transaction 0 0 1 0 1 usesStmtJournal=0
9 Goto 0 1 0 0