Получи случайную криптовалюту за регистрацию!

SQLite на практике

Логотип телеграм канала @sqliter — SQLite на практике S
Логотип телеграм канала @sqliter — SQLite на практике
Адрес канала: @sqliter
Категории: Технологии
Язык: Русский
Количество подписчиков: 2.13K
Описание канала:

Все о работе с данными в sqlite // antonz.ru

Рейтинги и Отзывы

1.50

2 отзыва

Оценить канал sqliter и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

0

3 звезд

0

2 звезд

1

1 звезд

1


Последние сообщения

2022-08-31 20:29:08 Расширения SQLite для процессоров Apple

Наконец дошли руки настроить сборку расширений для ARM-процессоров Apple (M1, M2).

Плюс вместо кучи мелких файлов сделал по архиву для каждой операционной системы.

Заодно напомню, какие сейчас есть расширения:

— crypto: криптографические хеш-функции вроде SHA-1 и SHA-256.
— fileio: работа с файловой системой — чтение и запись файлов, создание каталогов.
— fuzzy: нечеткое сравнение строк, фонетические алгоритмы, транслитерация.
— ipaddr: манипуляция IP-адресами и подсетями.
— json1: работа с JSON.
— math: математические функции.
— re: регулярные выражения.
— stats: статистика — медиана, процентили, стандартное отклонение.
— text: работа со строками.
— unicode: поддержка юникода для функций upper(), lower() и LIKE.
— uuid: генерация уникальных идентификаторов.
— vsv: работа с CSV-файлами как с таблицами базы.

И еще вагон расширений в инкубаторе (для них сборку под ARM пока не делал).

https://github.com/nalgeon/sqlean/releases/latest
300 views17:29
Открыть/Комментировать
2022-05-20 09:39:55 Про курсы

Как знают давние подписчики канала, у меня есть три курса на Степике:

— Оконные функции SQL
— SQLite на практике
— SQLite для аналитики

Первые два частично охватывают материал третьего. Поэтому я решил, что будет правильно давать скидку на «SQLite для аналитики» для выпускников «окошек» и «на практике».

Так что если вы:

— успешно решили все задачки в «SQLite на практике» (скидка 500₽),
— или получили сертификат с отличием в «Оконные функции SQL» (скидка 500₽),
— и хотите пройти «SQLite для аналитики»,

то присылайте ссылку на свой Степик-профиль мне @nalgeon, чтобы получить промо-код.
448 views06:39
Открыть/Комментировать
2022-05-18 14:24:45 Временные таблицы

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

select v.*, e.name, a.name
from vacancy as v
join employer as e on e.id = v.employer_id
join area as a on a.id = v.area_id

Теперь хочется запускать запросы по сводным данным. Есть три способа это сделать:

1) Common Table Expression (CTE)
2) Представление (view)
3) Временная таблица (temporary table)

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

Представление — это такой именованный селект, к которому можно обращаться как к обычной таблице:

create view vacancy_view as
select ... from ... join ...;

select * from vacancy_view;

Очень похоже на CTE, только не приходится каждый раз повторять селект в запросе — достаточно написать название представления. Как и CTE, представление тоже вычисляется каждый раз.

Во многих СУБД есть материализованные представления, которые сохраняют данные на диск — но не в SQLite.

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

create temporary table vacancy_temp as
select ... from ... join ...;

select * from vacancy_temp;

Временные таблицы отлично подходят для экспериментов, когда вы только знакомитесь с данными. Можно позволить себе любые безумства — ведь после отключения от базы все будет забыто ツ

песочница
476 viewsedited  11:24
Открыть/Комментировать
2022-05-15 14:20:25 JSON и виртуальные столбцы

Допустим, вы решили вести журнал событий, которые происходят в системе. События бывают разных типов, у каждого свой набор полей. Например, вход в систему:

{
"timestamp": 1652614531,
"object": "user",
"object_id": 11,
"action": "login",
"details": {
"ip": "192.168.0.1"
}
}

Или пополнение счета:

{
"timestamp": 1652614584,
"object": "account",
"object_id": 12,
"action": "deposit",
"details": {
"amount": "1000",
"currency": "USD"
}
}

Вы решаете не заниматься нормализацией по таблицам, а хранить прямо в JSON. Заводите таблицу events с единственным полем value:

select value from events;

{"timestamp":1652614531,...
{"timestamp":1652614584,...
{"timestamp":1652614644,...

И выбираете события по конкретному объекту:

select
json_extract(value, '$.object'),
json_extract(value, '$.action')
from events
where json_extract(value, '$.object_id') = 11;

┌────────┬────────┐
│ object │ action │
├────────┼────────┤
│ user │ login │
└────────┴────────┘

Все здорово, но json_extract() при вызове каждый раз парсит текст, так что на сотне тысяч записей запрос будет работать медленно. Что делать?

Создать виртуальные столбцы:

alter table events
add column object_id integer
as (json_extract(value, '$.object_id'));

Построить индекс:

create index events_object_id on events(object_id);

Теперь запрос работает моментально:

select object, action
from events
where object_id = 11;

Благодаря виртуальным столбцам получилась практически NoSQL база данных ツ

песочница
524 viewsedited  11:20
Открыть/Комментировать
2022-05-06 16:13:14 Вычисляемые столбцы

Иногда поле в запросе рассчитывают на основе других столбцов таблицы.

Например, есть столбец income с годовым доходом и tax_rate с налоговой ставкой. Тогда можно посчитать годовой налог:

select
id,
income * tax_rate as tax
from people;

А чтобы не таскать везде эти вычисления, удобно создать виртуальный столбец.

В общем виде синтаксис такой:

alter table ТАБЛИЦА
add column СТОЛБЕЦ ТИП as (ВЫРАЖЕНИЕ);

Для налогов будет так:

alter table people
add column tax real as (
income * tax_rate
);

После этого столбец можно использовать в запросах точно так же, как обычные столбцы:

select id, tax
from people;

Виртуальные столбцы не хранятся в базе и рассчитываются «на лету». Но по ним вполне можно построить индекс, если захотите ускорить выборку.

Строго говоря, в SQLite есть виртуальные (virtual) вычисляемые столбцы и хранимые (stored). Хранимые сохраняются на диске, но создать их через alter table невозможно, поэтому в основном пользуются виртуальными.

Вычисляемые столбцы могут использовать любые столбцы таблицы, но не другие таблицы и не результаты подзапросов. Оно и к лучшему: для более сложных комбинаций есть представления (views) и временные таблицы (temp tables). Но о них как-нибудь в другой раз.
833 viewsedited  13:13
Открыть/Комментировать
2022-04-19 16:44:23
Многострочные запросы в консоли

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

Достаточно вместо Enter использовать для перехода на новую строку сочетание Ctrl+V, Ctrl+J — и тогда многострочный запрос редактируется одним куском!
747 viewsedited  13:44
Открыть/Комментировать
2022-04-17 17:51:06 История команд в консоли

Если вы используете консоль SQLite (sqlite3), то она помнит последние 2000 выполненных команд. Чтобы повторить последнюю команду, достаточно нажать клавишу ↑, а поиск работает по сочетанию Ctrl+R.

По умолчанию файл истории хранится в каталоге пользователя и называется .sqlite_history. Он текстовый, так что можно просматривать хоть в редакторе. Если хотите сохранить в другом месте — укажите полный путь в переменной окружения SQLITE_HISTORY.

История записывается в файл при штатном выходе из консоли, так что если «моргнет» электричество или еще что — команды, выполненные с последнего запуска sqlite3, потеряются.

Конечно, запись истории — не единственная фича консоли. Например, через нее удобно импортировать и экспортировать данные или работать с несколькими базами одновременно. А вот отлаживать многострочные запросы — не слишком удобно
953 viewsedited  14:51
Открыть/Комментировать
2022-03-09 10:42:57 Курс «SQLite на практике»

Запускаю новый курс! Подойдёт всем, кто знаком с основами SQL, и хочет узнать о возможностях и особенностях SQLite.

Начал с трех модулей, хорошо знакомых выпускникам другого моего курса, «SQLite для аналитики»:

— Импорт, анализ и экспорт данных.
— Типы данных в SQLite.
— Работа с JSON.

В планах и другие модули, посвященные специфике SQLite.

Курс пока бесплатный, но это не навсегда.

Записывайтесь, если хотите прокачать понимание SQLite и не боитесь командной строки:

SQLite на практике
2.6K views07:42
Открыть/Комментировать
2022-02-27 12:12:56 Война

Я никогда не был «вне политики». Но предпочитал не транслировать свои взгляды публично. К сожалению, это время прошло.

Вторжение России в Украину — это преступление против обеих стран. Это предательство России, ее интересов и граждан. Это преступление против Украины и ее граждан. Это преступление против мира.

Если вы против войны — не молчите, заявите об этом. Необязательно выходить на улицу под дубинки полицейских. Напишите вашему депутату. Если ведете соцсети — напишите там. Подпишите петицию.

Сейчас кто молчит — одобряет. Не молчите.

Позволит ли конкретно ваш одинокий голос остановить войну? Конечно, нет. Руководству страны плевать на любые петиции. Но он поможет другим увидеть, что они не одни. Что граждан России, которые против войны — много. Поможет задуматься людям, которые привыкли слушать только телевизор.

Боевые действия в Украине должны немедленно прекратиться. Не должны больше гибнуть мирные жители и военнослужащие наших стран.

Нет войне!
783 views09:12
Открыть/Комментировать
2022-01-27 20:06:30 Как хранить дату в SQLite

В SQLite нет отдельных типов для даты и времени. Поэтому у вас есть только два варианта, каждый со своими достоинствами и недостатками. Рассмотрим их вкратце.

ISO 8601

Международный стандарт, который записывает дату как 2022-01-27, а дату-время как 2022-01-27 19:30:15. Иногда добавляют еще миллисекунды: 2022-01-27 19:30:15.123.

Стандарт включает кучу нюансов, но основные формы записи именно такие.

Дата при этом хранится в SQLite как текст. Занимает 12 байт (без времени), 21 байт (до секунд) или 25 байт (с миллисекундами).

Человекочитаемая дата
Удобно сравнивать ('2021-12-30' < '2022-01-27')
Неудобно считать разницу между датами
Занимает много места

Unix Time

Unix Time — это количество секунд, прошедшее с 01.01.1970. Например unix time для 2022-01-27 19:30:15 = 1643311815, а для 1960-03-25 = -308361600.

Дата при этом хранится в SQLite как число: целое, если достаточно точности до секунды, или действительное — если нужны миллисекунды. Занимает 8 байт.

Удобно сравнивать
Удобно считать разницу между датами
Компактное представление
Непонятна человеку

Часовые пояса

Если вы работали раньше с «международными» датами в любом виде, то знаете, как больно бывает от часовых поясов. В SQLite с ними все просто: часовые пояса не поддерживаются.

Поэтому, какой бы формат вы не выбрали (ISO 8601 или Unix Time), соблюдайте главное правило:

Хранить даты только в часовом поясе UTC

Иначе никогда концов не найдете.
351 views17:06
Открыть/Комментировать