sqlite-gui: еще один редактор SQLite для Windows

Всё начиналось как простое средство для выполнения запросов к SQLite базе с сохраняемой историей запросов и кода в редакторе, написанное по старинке на WinAPI. Потихоньку оно обросло функционалом, и, если бы я с самого начала знал во что это выльется, то не взялся бы.
Общий вид приложения

Что есть


Подсветка синтаксиса и автодополнение
Реализовано достаточно наивно, без участия лексического парсера, но в большинстве случаев работает как надо. Для редактора запросов используется Richedit-компонент (msftedit.dll), который в Windows 10 имеет некоторые проблемы. По этой причине в дистрибутив включена версия от Windows 7. Отмечу, что для больших запросов подсветка в DB4S работает значительно быстрее за счет работы только с видимой частью запроса.
Раскраска ячеек результата по их типам, как в SQLiteSpy
Раскраска позволяет визуально понять тип данных, используемый для хранения значения, чтобы отличить NULL-ячейку от пустой строки или, к примеру, текст 123 от числа.

Раскраска строк данных

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

Одновременное редактирование нескольких таблиц

История успешно завершенных и пользовательских запросов
Запросы в редакторе после успешного выполнения/сохранения помещаются в таблицы history и gists в базе настроек prefs.sqlite и доступны потом через интерфейс.

История запросов

Экспорт и импорт данных
Помимо стандартных экспорта и импорта в .csv и .sql есть возможность переноса данных из/в внешних источников через ODBC, таких как Access, Excel или Postgres, при наличии установленных в системе 32-битных драйверов. Реализовано при помощи odbc-расширения. Поддерживаются только базовые типы.
Диаграмма базы данных с поиском
Позволяет найти зависимости в базе или колонки по части имени. Сделано на скорую руку, потому визуально выглядит не очень.

Диаграмма базы данных

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

Сравнение баз данных

Поиск по всей базе
Если заранее не известно, где может быть искомое, то можно воспользоваться поиском по всей базе. Поскольку поиск выполняется обычным col1 like .. or col2 like ... по всем столбцам, то для больших баз поиск будет медленным. Подсмотрен в Heidi.

Поиск по всей базе

Быстрый просмотр связанных данных
Получив в результатах запроса некоторый id, иногда приходится выполнять дополнительный запрос, чтобы узнать что скрывается за этим id. sqlite-gui позволяет избежать этого: достаточно кликнуть по id с зажатым Alt. Связь с таблицей источником формируется по внешним ключам базы, а в случае, если эти ключи не используются, может быть добавлена отдельно в таблице refs базы настроек prefs.sqlite.

Быстрый просмотр связанных данных

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

Терминал

Графики
Как и в DB4S, в sqlite-gui можно просмотреть результат запроса в виде графика. На данный момент поддерживается пять типов: линии, точки, области (на рисунке ниже), гистограмма и горизонтальные полоски.

Графики

Параметризованные запросы
В запросе из кода реального приложения, то могут быть плейсхолдеры, напр. select * from orders where id = ?1. Если запрос большой, то их можно пропустить и выполнить запрос в менеджере как есть, в результате чего некоторые менеджеры считают что передан NULL (SQLite считает такой запрос валидным) и возвращают пустой ответ.
Генерация данных для таблиц
Генерируемое значение может быть: последовательностью (напр. для id), числом или датой из интервала, ссылкой на значение из другой таблицы или одним из заранее подготовленного списка, хранящегося в таблице generators базы настроек prefs.sqlite.
Включение и отключение триггеров и индексов
Иногда для ускорения импорта данных требуется отключить триггеры и индексы на таблице. Отмечу, что SQLite позволяет отключить/включить все триггеры в базе, вызовом sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_TRIGGER, 0/1), но вот для индексов такого нет. sqlite-gui при отключении индекса или триггера производит его удаление из базы с сохранением DDL в таблице deleted базы настроек prefs.sqlite. Индексы, определенные в DDL таблицы отключить нельзя.
Набор расширений
В дистрибутив включено несколько расширений: часть из них стандартные, как напр. series и uuid, часть самописных, напр. XML и ora, и одно стороннее icu. Описание всех расширений и их функций есть в Wiki.
Поддержка зашифрованных баз данных
Работает через vfs-расширение SQLite3 Multiple Ciphers. Поддерживаются практически все распространенные способы шифрования SQLite. Минус только в том, что SQLite требуется собирать уже из исходников этого проекта, а не с сайта SQLite. Если доступ к зашифрованным базам не требуется, то можно использовать дистрибутив sqlite-gui-x.y.z-no-ciphers.zip.

Настройки шифрования базы данных

Поддержка триггеров instead-of, позволяющая редактировать данные представления
Если представление имеет триггеры intead-of update/insert/delete, то данные такого представления можно редактировать как обычную таблицу. Было сделано по просьбе одного из пользователей.
Параллельное выполнение запросов
Некоторые менеджеры SQLite используют только одно подключение к базе и поэтому, при выполнении долгого запроса, остальные дожидаются его выполнения. Это особенно неприятно, поскольку может вызывать зависание интерфейса, который для своей работы также формирует запросы. sqlite-gui для каждой вкладки редактора использует отдельное подключение и одно для работы интерфейса, что позволяет отчасти избежать такой проблемы. Минус этой схемы в том, что каждое соединение использует свою TEMP-схему для временных таблицы, которая недоступна другим. Поэтому вместо TEMP предлагается использовать автоподключаемую in-memory базу SHARED.
Другое
Описание всяких мелочей, таких как открыть базу только на чтение или в памяти, доступно в главном меню программы ? > Tips.

Чего нет


Редактирование структуры таблицы
В SQLite нет возможности изменить порядок столбцов или тип столбца. Для имитации этого другие менеджеры парсят DDL таблицы и на этой основе создают новую таблицу, в которую переливают данные из исходной. Помимо особенностей парсинга DDL, также следует учитывать наличия триггеров и индексов на таблице и её вхождение в представления. Сделать надежно достаточно сложно, потому и нет.
Просмотр BLOB-полей как Hex или изображения
Возможно в будущем.
Автоматическое форматирование запросов
С одной стороны это востребованная функция для тех кто работает с большими запросами, а с другой — большие запросы на SQLite редкость. Возможно будет добавлено в будущем.
Построитель запросов
Написать построитель просто. Гораздо сложнее написать разбор имеющегося запроса в диаграмму построителя. В виду этого и сомнительной полезности данной возможности, построителя нет.
Пользовательские сопоставления (collation)
Очень редко надо.
Пользовательские функции
В SQLiteStudio можно писать свои функции на SQL/QtScript/Tcl. Проблема таже, что и с пользовательскими скриптами (см. ниже), и поэтому функции предлагается добавлять через расширения.
Поддержка скриптов
В SQLiteManager есть возможность писать скрипты для загрузки данных на Lua. Однако пользователи скорее предпочтут стандартный Python. Не избежал этой ошибки и я, предлагая в ранних версиях свой визуальный редактор для ETL.
Печать
Непонятно для чего может быть надо.
Редактор форм, как в Valentina Studio
Как и в случае с печатью, не очень понятно зачем это может быть надо.
Мультиязычный интерфейс
Считаю излишним.
Поддержка Linux, iOS и других
Для этого потребовалось бы использовать фреймворк для кроссплатформенной разработки. Скорее всего это был бы QT, который используют большинство менеджеров (еще встречается Java).
Выбор темы оформления
У стандартных компонент WinAPI, используемых в sqlite-gui, нет возможности изменения темы, кроме самостоятельной отрисовки, что требует дополнительного кодинга.
Восстановление базы и удаленных строк
Формат SQLite иногда позволяет исправить поврежденную базу (SQLite CLI, команда .restore) или восстановить удаленные строки (напр. undark). Поскольку для этого нет API и требуется изучение самого формата, то этого нет.
Редактор прагм
Несмотря на то, что DB4S имеет отдельную вкладку для этого, обычно считается, что пользователям не требуется иметь подобный инструмент.

Недостатки


По умолчанию результат запроса имеет ограничение в 10000 строк
Стандартный компонент ListView, используемый для отображения табличных данных, не рассчитан на большое количество строк. Для обхода этого требуется использовать виртуальный режим, что достаточно муторно. Как и другой способ, используемый в DB4S, — подгружать только видимую часть данных.
Невозможно из редактора задать значение в виде пустой строки (только NULL)
С моей точки зрения, пустая строка используется редко, и потому, чтобы избежать загромождения интерфейса, в нем нет возможности для текстового поля задать что именно подразумевалось под пустым пользовательским вводом — NULL или пустая строка.
Только 32-битная версия
Изначально проект использовал Code: Blocks 17 с mingw32 5.1 (имеет небольшой размер). Потом из-за проблемы с VirusTotal компилятор был обновлен до 9-ой версии. И уже после был обнаружен mingw64, который позволяет собирать 32 и 64-битные версии. С другой стороны 64-битная версия, для которой требуются правки, не будет иметь каких то значимых преимуществ, кроме, пожалуй, более свежих ODBC драйверов.

Страница проекта — github.com/little-brother/sqlite-gui
Скачать последнюю версию — github.com/little-brother/sqlite-gui/releases/latest

© Habrahabr.ru