Профиль: Аноним (вход | регистрация) неRU opennet.me  
OpenNET

[ новости /+++ | форум | теги |    ]



"Поведение кнопки 'Выполнить' в SQL-редакторе при нескольких зап"
Вариант для распечатки  
Пред. тема | След. тема 
Форум WEB технологии (PostgreSQL)
Изначальное сообщение [ Отслеживать ]

"Поведение кнопки 'Выполнить' в SQL-редакторе при нескольких зап"  +/
Сообщение от libredbemail (ok), 15-Сен-26, 23:26 
Мы делаем LibreDB Studio, SQL-редактор под MIT (https://github.com/libredb/libredb-studio).
В прошлый раз я публиковал здесь анонс проекта, и обратная связь оказалась полезнее, чем где бы то ни было ещё, поэтому прихожу с вопросом, а не с релизом.

Вопрос поднял один из контрибьюторов, и у нас нет уверенного ответа. Пусть в редакторе набрано:

```
    CREATE TABLE test (...);
    INSERT INTO test VALUES (...);
    SELECT * FROM test;
```

Что должно произойти по "Выполнить"?

Варианты, которые мы рассматриваем:

1. Выполняется весь буфер. Для части кода есть отдельное "Выполнить выделенное".
2. Выполняется оператор под курсором. Весь буфер идёт через отдельное "Выполнить всё".
3. Выделение имеет приоритет: нет выделения, выполняется оператор под курсором; есть выделение, выполняется выделенное; "Выполнить всё" вынесено отдельно.

Как сейчас сделано у нас, чтобы вопрос не выглядел абстрактным: работает третий вариант, но без последней части. Есть выделение, выполняется оно; нет выделения, выполняется оператор, внутри которого стоит курсор. Отдельной команды "Выполнить всё" нет вообще, весь буфер можно выполнить только через Ctrl+A. Это и есть дыра, из-за которой мы вообще завели обсуждение.

Отдельный вопрос, который на практике оказывается важнее первого: транзакции. Должен ли скрипт из нескольких операторов по умолчанию идти в одной транзакции, или управление транзакцией всегда остаётся явным делом пользователя?

Что у нас сделано сейчас и почему:

- Неявная транзакция не открывается. Операторы выполняются последовательно, выполнение останавливается на первой ошибке.
- Если пользователь сам написал BEGIN и не написал COMMIT, транзакция откатывается по завершении скрипта. Причина не в идеологии, а измерена: соединение кэшируется на уровне процесса и переиспользуется, поэтому оставленная открытой транзакция достаётся следующему запросу. На PostgreSQL 17 следующий запрос другого пользователя получал "current transaction is aborted", на SQLite и DuckDB его запись просто терялась.
- Разбор на операторы идёт по диалекту, а не по простому поиску ";". Причина тоже измерена: PostgreSQL вкладывает блочные комментарии, поэтому /* a /* b */ ; DROP TABLE users; -- */ SELECT 1 там является одним оператором, а плоский разбор превращал его в три, второй из которых был голый DROP. Для Cassandra, ScyllaDB и ClickHouse та же история с //.

Интересно услышать, к чему вы привыкли и что считаете правильным: DBeaver, DataGrip, SSMS, pgAdmin, TablePlus, Toad, PL/SQL Developer, phpMyAdmin ведут себя по-разному. Ответы вида "я работаю в psql и GUI мне не нужен" тоже полезны, тогда напишите, какое именно поведение psql вы хотели бы видеть воспроизведённым: autocommit по оператору, \i, ON_ERROR_STOP.

Обсуждение на GitHub, если хочется посмотреть исходную формулировку или ответить там: https://github.com/orgs/libredb/discussions/776

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "-"  +/
Сообщение от Аноним (1), 17-Сен-26, 18:52 
запилите внутри функций отдельно execute-last, execute-region и execute-all, у всех семантика разная, меньшее удивление - разбить на 3 функции.

по результатам того, что чаще всего используется, биндьте кнопки

максимум, если особо хочется - сделайте execute-all смерженный с execute-region в случае наличия этого region, при этом мутируйте иконку execute-all в регион по выделению

я не очень помню, как там в каких редакторах, но у емакса выполнить все окно, выполнить выделение и выполнить стейтмент чётко разделены и не смешиваются, но у емакса и region можно зафиксировать выделенным вроде

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

>Отдельный вопрос, который на практике оказывается важнее первого: транзакции.

бахну не в тему: запилите инсёрт мелкими батчами с автотранзакциями по страницам, страницы рисовать самим, куча неоsqlяторов, особенно не умеющих рисовать транзакции в огромном инсерт-скрипте скажут вам спасибо

>Ответы вида "я работаю в psql и GUI мне не нужен"

а у вас есть консольная версия?

Ответить | Правка | Наверх | Cообщить модератору

2. "-"  +/
Сообщение от libredbemail (ok), 18-Сен-26, 00:42 
>[оверквотинг удален]
> не смешиваются, но у емакса и region можно зафиксировать выделенным вроде
> алсо, если пользуетесь кликпадами, они имеют обыкновение глючить и ломать region, а
> уж курсор от неглючного тачпада и так сам скачет куда не
> надо
>>Отдельный вопрос, который на практике оказывается важнее первого: транзакции.
> бахну не в тему: запилите инсёрт мелкими батчами с автотранзакциями по страницам,
> страницы рисовать самим, куча неоsqlяторов, особенно не умеющих рисовать транзакции в
> огромном инсерт-скрипте скажут вам спасибо
>>Ответы вида "я работаю в psql и GUI мне не нужен"
> а у вас есть консольная версия?

Спасибо,
Сразу скажу, зачем я вообще пришёл с вопросом, а не с готовым решением: как это чинить, мы хотим решать вместе с теми, кто каждый день работает в SQL-редакторах, а не выбрать вариант внутри команды и потом объяснять, почему он такой. Поэтому и спрашиваю до того, как что-то меняется.

Довод про тачпад и сбитый region для меня новый, и он бьёт не по выбору варианта, а по самой идее выводить поведение из состояния выделения. То есть ровно по тому, как сделано сейчас: Cmd/Ctrl+Enter, единственная команда выполнения, и она сама решает, выполнить выделенное или оператор под курсором. Отдельной команды на весь буфер нет вообще.

Про батчи, чтобы ответить по факту, а не по намерению: сейчас скрипт из нескольких операторов идёт последовательно, без неявной транзакции, с остановкой на первой ошибке, и весь результат приходит одним ответом в конце, то есть прогресса по ходу выполнения нет. Коммита по страницам тоже нет. Уточните, что для вас здесь главное: коммит по страницам, чтобы огромный скрипт не жил одной транзакцией, или видимый прогресс с возможностью остановиться?

Консольного клиента в смысле REPL нет. npx @libredb/studio поднимает локальный сервер и открывает веб-интерфейс, для десктопа есть AppImage и .deb, но это тот же интерфейс в отдельном окне, а не TUI.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




XSQUARE
Inferno Solutions
Hosting by Hoster.ru
Хоcтинг:

Закладки на сайте
Проследить за страницей
Created 1996-2026 by Maxim Chirkov
Добавить новость, Поддержать