Современный SQLite: STRICT-таблицы

Я начинаю серию коротких заметок о полезных функциях современного SQLite, про которые вы (возможно) не слышали. Начнем со «строгих» таблиц.

Как вы наверняка знаете, SQLite обладает гибкой системой типов (за что некоторые даже называют его «джаваскриптом в мире СУБД»). Вы можете хранить любые значения в столбцах любых типов: например, строки в INTEGER-столбце или бинарные данные в REAL-столбце.

Кто-то любит SQLite за эту гибкость, другие ненавидят за нее же. Поэтому в какой-то момент авторы SQLite добавили «строгие» (STRICT) таблицы:

create table people (
  id integer primary key,
  name   text,
  salary real
) strict;
ok

Они проверяют типы так же, как традиционные СУБД вроде PostgreSQL или MySQL:

insert into people (name, salary)
values ('Alice', 100);
ok
insert into people (name, salary)
values ('Bob', 90.5);
ok
insert into people (name, salary)
values ('Cindy', 'decent');
Runtime error: cannot store TEXT value
in REAL column people.salary

Даже в строгой таблице можно объявить столбец как ANY — тогда в нем можно хранить значения любых типов. Получается, можно взять лучшее от обоих миров — строгую проверку типов и опциональную гибкую типизацию:

create table people (
    id integer primary key,
    name   text,
    salary any
) strict;

insert into people (name, salary)
values ('Alice', 100);

insert into people (name, salary)
values ('Bob', randomblob(10));

insert into people (name, salary)
values ('Cindy', 'decent');
ok

Работает в SQLite 3.37+ (ноябрь 2021).

Документация

Подписывайтесь на канал, чтобы не пропустить новые заметки 🚀