Как стать автором
Обновить

Комментарии 89

Использую эту базу данных в своих приложениях в качестве хранилища конфигурации (когда эта самая конфигурация достаточно сложная).
А я использую в качестве файла проекта. Удобно добросить/удалить данные, сделать их выборку/сортировку по разным критериям, сохранить состояние программы и потом вернуться к какой-то длительной операции над данными спустя некоторое время (хоть на следующий день, хоть через 2 года).

Да, так тоже можно! Я взял этот пример кода из урока, который идет еще до изучения оконных функций. Поэтому он без них ツ

НЛО прилетело и опубликовало эту надпись здесь
У меня больше чем в 3-10 раз (в зависимости от приложения) ускорить не удавалось :). Это даже если полностью отключать проверку консистентности.

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


pragma journal_mode = WAL;
pragma synchronous = normal;
Да, я именно на них и остановился в production
Мне тоже кажется, что 10000 — это художественное преувеличение
Скорее всего, это если сравнивать самый худший и самый лучший вариант. Где самый худший — это добавления тысяч строк по одной без использования транзакций, при настройках на самом надежном и медленном режиме.
НЛО прилетело и опубликовало эту надпись здесь
но то-ли хитрозадая Винда научилась игнорировать избыточные sync-и

Да, чтото с syncом они сделали. У меня на win 10 из под WSL какие то нереальные цифры теста производительности fsync у пг получаются
Есть несколько видов sqlite-dict, которые умеют только делать таблицу в 2 колонки и представлять её как словарь — но зачастую большего и не нужно.
Естественно. И это для 95% задач хватает даже с избытком. Однако же тогда зачем этот скюлайт-словарь?)) Обычных программных словарей опять же хватает для таких задач. Автор там где-то пишет, что почитал он или что-то вписал куда-то и у него оно АЖ 240тыщ вроде записей в секунду составило. Извините, но заполнение/чтение/вставки в программные словари — это миллионы «записей» в секунду, обычное дело. Я про то что программные штатные средства работают на порядок быстрее (даже в шарпе).

п.с.: Как бы я не использовал все эти бд даже узкозаточенные — один фиг всегда перехожу на самописный код, ибо да, оно как минимум на порядок быстрее работает, чудес не бывает.
п.п.с.: Понятное дело что самописное годится не всем и не всегда, но тем не менее как оно и было написано кем то тут — все эти бд — это игрушки…
НЛО прилетело и опубликовало эту надпись здесь

Спасибо тебе, добрый человек!


sqlitedict прямо то, что доктор прописал, похоже, для своих проектов самое оно (и не только).


Плюс еще там можно и запросы выполнять, а учитывая нативную поддержку json, все вообще замечательно :)

Я в основном использую SQLite для прикладного анализа данных. Загрузить датасет из csv / json, найти проблемы в данных, почистить данные, сджойнить таблички, пофильтровать, сгруппировать, посчитать агрегаты, выгрузить обратно в csv — как-то так.


Удобно, что в большинстве случаев не приходится даже ничего писать на Python. SQL, как декларативный язык, созданный специально для обработки данных — компактнее и проще, чем скрипты.


Еще использую SQLite как базу для блога. Работает быстро, удобный бекап — закоммитил один файл в гитхаб и готово.

НЛО прилетело и опубликовало эту надпись здесь

Да, именно! Получается быстрее и удобнее пандаса. Конечно, пандас мощнее, но мощь его редко когда требуется. SQLite прекрасно справляется в большинстве случаев.

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

Эксель прекрасный инструмент, ни в коем случае не хочу как-то его принизить. Но вот нормально работать в нем с несколькими связанными таблицами — совсем не получается.


В целом, «SQLite против Excel» чем-то схоже с «командная строка против проводника». Безусловно, сложнее. Но если освоить — удобнее, мощнее и продуктивнее для большого класса задач.

Я бы еще поспорил кто сложнее, по-моему excel это та бездна которую до конца изучить невозможно.
Я как раз хочу попробовать решение автора потому что SQL сам по себе проще и более знаком мне, а в экселе слоожные сценарии мне надо либо гуглить либо обходится тем что знаю и делать больше руками.
Например я сходу не помню как легко аггрегировать данные с нескольких листов, хотя и видел это.
Я разбивал джсон на колонки, делал поиск по вложенным полям-но сейчас хоть убей не вспомню как-если понадобится буду опять гуглить.

НЛО прилетело и опубликовало эту надпись здесь

Для меня Power Query — это еще один навороченный доменный язык для работы с данными. Осваивать его совершенно не хочется, потому для работы с данными уже придумали SQL, который поддерживается всеми современными СУБД.


Визуально, конечно Power Query круче консоли SQLite. Но если вместо консоли использовать Apache Superset или Metabase — получится еще круче.

НЛО прилетело и опубликовало эту надпись здесь

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

Подскажите, что за движок такой у блога? Статьи в markdown пишутся, или что-то визуальное?

Использую Ghost, это движок с UI. Он по умолчанию предлагает MySQL, но можно поставить на SQLite, что я и сделал.

Здравствуйте. А можно подробнее про решение для блога? Это какой-то движок для блогов или статический генератор сайтов? И что именно коммитится? Некий патч в бд, маркдаун статьи или что-то третье? Вообщем, интересна и эта прикладная часть использования СУБД! Заранее спасибо за ответ.

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Так его никуда не прикрутишь:)
НЛО прилетело и опубликовало эту надпись здесь

Используем LiteDB в своём проекте уже несколько лет (около 15 тыс установок у клиентов, довольно небольшая нагрузка, порядка 1 rps вида «прочитать состояние из бд, внести изменения, сохранить назад обновлённую версию», размер базы порядка 10-100мб).
Мигрировали с LocalDb, во время миграции сравнивали с SQLite по производительности/удобству.
Основной плюс — работает очень быстро. Как мы не тюнили SQLite — litedb из коробки обгонял его по нашему workflow работы (без изменения основной логики приложения) в разы. Оба они на порядок обгоняли localdb.
Главный минус — я бы не назвал litedb production-ready. Периодически всплывают баги, приводящие к нарушению структуры базы и делающие её нечитаемой. Уже по-моему третья «мажорная» версия вышла которая обещает что вот теперь то мы их все исправили, но на нашей клиентской Бахе все равно раз в пару месяцев у кого-нибудь что-то ломается. В другом use-case где мы используем её чисто как кеш (под достаточно объемные данные часто изменяющиеся) — у неё течёт размер и раз в несколько месяцев приходится руками сносить Файлы, потому что размер бд вырастает до десятка Гб.
Своя структура работы, нет поддержки популярными Orm, нет транзакций (по крайней мере когда мы её выбирали, потом их добавили, потом отказались, в общем политика меняется от версии к версии).


В целом — для собирания Proof of concept проекта с последующей переделкой, или под данные которые если что не жалко потерять или можно восстановить из других источников — очень удобно. Настраивается быстро, работа интуитивная, все летает. Но как полноценную единствннную БД в серьезном проекте — я бы не стал использовать.

НЛО прилетело и опубликовало эту надпись здесь
Embedded NoSQL database for .NET
An open source MongoDB-like database with zero configuration — mobile ready

по-моему описание с www.litedb.org/ говорит само за себя.
Из плюсов — доступно в исходниках.
Еще можно добавить SQLCipher
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь

Вот так с помощью нехитрых инструментов можно построить SQL сервер из буханки хлеба ;)

НЛО прилетело и опубликовало эту надпись здесь
«Но зачем?» (ц)

Частенько использую sqlite для in-memory хранилища, когда нужно делать множественные выборки данных по нескольким полям.

Рассказываю, почему игрушка (для кто не в курске):


bash-5.1$ sqlite3 test.sqlite
-- Loading resources from /Users/justhabrausr/.sqliterc
SQLite version 3.28.0 2019-04-15 14:49:49
Enter ".help" for usage hints.
sqlite> CREATE TABLE abc (icol INTEGER);
sqlite> INSERT INTO abc (icol) VALUES ("tratata");
sqlite> SELECT * FROM abc;
tratata
sqlite> .quit
bash-5.1$ 

Так что не всё то лапочка, что солнышко.

Вон в C (язык программирования) тоже можно напрямую в память писать (невзирая на тип данных) и выстрелить себе в ногу, а то и в голову. И никто не считает его игрушкой из-за этого.

Я, видимо, что-то пропустил.
Покажите как одной строчкой C записать напрямую в память невзирая на тип данных.
Без предупреждений компилятора и runtime error. Как в примере с SQLite.
PS. это не к тому, чтобы сравнивать С и SQLite (занятие довольно бестолковое непрактичное), а чисто по-женски интересно стало.

  1. man memcpy: "Функция memcpy() копирует n байтов..." (AKA uint8_t).
  2. В постановке задачи — не "с приведением к void", а "невзирая".

"Не прокатило..." ©

void * memcpy(void *dst, const void *src, size_t len); (man memcpy (freebsd 12.1))
байт в данном случае выступает как минимальная единица длины данных, а не как тип данных. SQLite тоже не позволяет мне 3 бита в память записать.
П.С. байт это не обязательно 8 бит, поэтому, если упарываться дальше, то можно вводить и всякое типа uint7_t =)
НЛО прилетело и опубликовало эту надпись здесь

Я может открою Вам тайну, но всё серьёзное в мире написано на С. Даже некоторые новые языки ;)

НЛО прилетело и опубликовало эту надпись здесь

Да, в плане типов SQLite — это своеобразный JavaScript. Если для кого-то это проблема, можно просто не использовать такую «динамическую типизацию». Используйте The Good Parts ツ

Нельзя. То есть можно, но баги никто не отменял. Рано или поздно вы напутаете порядок полей в каком-нибудь инсерте. А чем раньше ошибка обнаружена, тем меньше от нее вреда. В идеале на этапе статического анализа кода.

А начиная с версии 3.37 типы полей и вовсе не проблема, потому что можно использовать STRICT-таблицы.

можно поставить крайне не информативный чекер CHECK(icol+1 > icol)
Полностью поддерживаю. Меня в приложении выморозила еще более тупая фишечка (на Android): если поле таблицы строка и туда вставить строку только с цыфрами, то на выходе — ошибка парсинга при попытке получить это поле как строку. Это просто шутка на первое апреля а не БД, но выбор нет
это точно не sqlite а та библиотека через которую работаете с базой
Есть выбор, это же джава, write once run anywhere.
Добавлю что еще sqlite используется в не очень известной но очень функциональной системе контроля версий Fossil
Все хранилище в ней представлено в виде одного файла (БД SQLite) и при этом есть тикет система (веб интерфейс), запускается также из одного исполнимого файла.

Что характерно, Фоссил написан тем же самым автором — Ричардом Хиппом. Интересный дядька вообще.

Система контроля версий Monotone тоже использует SQLite.

Пожалуйста! Прикольный сервис, но потерял все картинки. Да и в целом формат твит-шторма — на любителя.

Всем советую sqlite для разных применений, отличная база

С удивлением (на самом деле нет, когда не читаешь всю документацию так бывает) узнал кучу нового, и про динамическую типизацию из комментов, и про with recursive,…
Хабр торт.

Можно даже обращаться к ней из нескольких соединений:
db = sqlite3.connect(«file::memory:?cache=shared»)
К сожалению только в пределах одного процесса, т.е. shared не имеет особого смысла и сомнительный юзкейс

Мне особенно нравится, что последние годы разработчики SQLite часто сознательно реализуют фичи точно так же, как сделано в PostgreSQL. Например, оконные функции сделаны именно так, и даже тестировались на постгресе. Кажется, такая унификация с лучшей опенсорсной реляционной СУБД — отличная идея.


К сожалению только в пределах одного процесса, т.е. shared не имеет особого смысла и сомнительный юзкейс

Почему сомнительный, разве он не подходит для async-операций в пределах одного процесса?

Для меня существенным минусом стало отсутствие case insensitive для non ASCII символов. Интересно, не собираются ли добавить функцию?

Она есть, но придется отдельно компилировать SQLite с поддержкой Unicode (SQLITE_ENABLE_ICU).

Есть небольшое расширение (это копия; оригинал вроде как уже не доступен), которое работает в большинстве случаев, в том числе и для русского языка. Актуально для Windows, где для SQLITE_ENABLE_ICU надо тащить большую библиотеку, а это не всегда хочется.

Да, отличная вещь, добавил в сборки.

Там какие-то дикие непонятки с sequence. Почему-то автор sqlite с недетской серьёзностью воспринимает автоинкременты, которые работают только в простейших случаях

Мне почему то статья напомнила времена (которые я не застал, но что-то о них читал), когда проповедовалось, что SQL — это вообще язык не для программистов, а для простых пользователей, ведь каждый может научиться писать такие простые команды и получать нужные ему результаты. Пропаганда, говорят, была очень активной, но безрезультатной — опыт использования показал, что даже такой язык — это слишком сложно для простого пользователя, не специализирующегося в IT.
Нет, общий вывод — что не стоит пренебрегать SQLite как рабочим инструментом — я поддерживаю, это действительно удобная система для некоторых вариантов использования.
Но, безусловно, не стоит пытаться воспринимать её как silver bullet, и пытаться встроить во все возможные и невозможные места.
Лично я, скорее, для части описанных в статье задач воспользуюсь Excel как более универсальным и простым инструментом, для других — более сложных — возьму более привычный мне SQL Server, благо у него тоже есть бесплатная версия, пусть чуть более сложная в первоначальной настройке, зато более привычная и удобная мне лично.

Прошу прощения за минус, хотел поставить плюс, но промахнулся на мобиле, а отменить непонятно как :(

НЛО прилетело и опубликовало эту надпись здесь
у mysql есть библиотека libmysqld причем очень давно, но мне кажется ее использовать сильно сложнее
Спасибо, очень информативно
Однажды, выкинул домашний сайт на joomla и переписал на чистом js + 10 строк php и sqlite. Выглядит также, занимает все вместе килобайт 100 (или 200 с картинками).
> .import --csv city.csv city

и с какой версии sqlite в import появился ключ --csv?
3.32.0. Поиск здесь по --csv

Можно и без него:


.mode csv
.import city.csv city

недавно заметил что некоторые проекты на .net core зачем-то подгружают sqlite. не знаю зачем

НЛО прилетело и опубликовало эту надпись здесь
спасибо! мне тоже показалось что это чтото инфраструктурное для самой среды разработки или вспомогательных систем
Firefox например вроде бы куки и букмарки в нём хранил. По крайней мере раньше.

Целую груду всякой всячины хранит, включая кэш.

Как и хром, как и сафари
Поэтому я решил сделать нормальный набор библиотек, с разделением по предметной области и автоматической сборкой для всех ОС. Пока библиотек там немного, но скоро прибавится:

так значить, дело и было не в хорошести SQLite))
У меня sqlite используется в моём приложении ReadRss, который сделан в виде расширения для браузеров.

Работает отлично в Chrome, Firefox, старой Opera, мобильном Kiwi

База 4 Гига — всё летает.
Ссылка? Ибо расширений с названием ReadRss не находится.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации