Обновить
16K+
4
cevheri@cevheri

Software Engineer

2
Рейтинг
Отправить сообщение

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

Первый: несовместимость проявляется не только на уровне протокола, но и внутри одного и того же каталога. Мы фильтруем системные схемы одним общим списком, и он оказался несущим, а не косметическим. Обзор считает pg_tables напрямую, а объектный браузер читает information_schema. На CockroachDB объекты crdb_internal попадают в pg_tables, но не проходят фильтр BASE TABLE в information_schema, поэтому две панели одного приложения показывали 98 и 2 таблицы для одной и той же схемы. На TimescaleDB браузер показывал 61 таблицу там, где пользовательских было 2: 34 чанка, 22 каталожных, 3 кеша. AlloyDB Omni: 10. Cloudberry: 4.

Второй ближе к проблеме Cassandra из статьи, но общее правило шире: сентинел легко превращается в измерение. PostgreSQL 14+ пишет в pg_class.reltuples значение -1, и это значит "я это не считал", а не "строк нет". Пока мы приводили его к нулю, таблица с тремя строками честно рапортовала, что пуста. Теперь -1 и NULL становятся отсутствием значения, и бейдж просто не рисуется, как в остальных случаях из статьи.

Честно про границы: правило "не ветвиться по типу движка" мы держим только внутри слоя провайдеров. В UI до сих пор живут три ветки по mongodb, и они у нас записаны как долг, а не как замысел.

Я мейнтейнер LibreDB Studio. Спасибо за публикацию, добавлю деталей и поправлю пару мелочей.

Пакет в npm называется @libredb/studio, запуск - npx @libredb/studio.

Канонический образ - ghcr.io/libredb/libredb-studio, на Docker Hub зеркало.

Демо по ссылке в новости - это стенд в режиме OIDC, без учётки Auth0 туда не зайти. Если хочется просто посмотреть и закрыть, есть второй стенд с обычным входом: trial.libredb.org, admin@libredb.org / Admin!2026. SQLite там уже подключён, ставить ничего не нужно. Оба стенда подняты с STORAGE_PROVIDER=local, то есть подключения лежат в localStorage вашего браузера и на сервере не сохраняется ничего. Свои боевые доступы туда, пожалуйста, не вводите - это стенд, а не сейф.

По ИИ важна не опциональность на словах, а механика: пока в окружении нет валидной конфигурации модели, помощник недоступен (NO_MODEL_CONFIGURED, src/lib/agent/config.ts), маршрутов к провайдеру нет и наружу не уходит ничего. Телеметрии в проекте нет вообще. Обратная сторона честная: если модель настроена, в неё уходят и схема, и строки, которые прочитал агент. Расписано по вызовам в docs/AGENT_DATA_FLOW.md, вместе с одним незакрытым местом (B29).

Чего не было в новости: внутри src/lib/db нет ни одного ветвления по типу БД, поведение задают возможности провайдера, а в CI стоит жёсткий гейт - ниже 100% покрытия строк сборка не проходит.

Известное ограничение, раз это веб-клиент: localStorage не шифруется, и против вредного расширения в браузере у нас, как и у любого веб-приложения, ответа нет. Это и список того, что не сделано, лежат в docs/SECURITY.md.

Готов ответить на вопросы по архитектуре или по конкретным движкам.

Спасибо за упоминание. Уточню одну деталь, не в свою пользу.

BEGIN READ ONLY сам по себе не гарантия. Он запрещает менять эту базу, но не запрещает писать в другое место. На PostgreSQL 18 суперпользователь внутри read-only транзакции спокойно выполняет COPY (…) TO PROGRAM, COPY (…) TO ‘<файл>’ и pg_read_file(). Формально всё это read-only.

Поэтому граница у нас проходит по привилегиям роли и проверяется при открытии соединения, а не берётся из конфигурации. Плюс extended query protocol, чтобы SELECT 1; COMMIT; INSERT ... не закоммитился наружу мимо транзакции.

Мысль общая, не про инструмент: любой контроль это утверждение про один ресурс. Вопрос всегда в том, до чего ещё дотягивается запрос.

Информация

В рейтинге
1 694-й
Зарегистрирован
Активность

Специализация

Фулстек разработчик, Архитектор программного обеспечения
Старший
SQL
Python
Linux
Kubernetes
Java
Next.js
Flutter
Docker
TypeScript
JavaScript