Раздел SQL — собственная база данных SQLite у каждого проекта. В ней вы сами создаёте таблицы, индексы и представления, правите данные руками, пишете любые запросы и обращаетесь к базе из бота. Это полноценный SQLite без ограничений в синтаксисе: всё, что умеет SQLite, работает и здесь.
База раздела SQL хранится отдельно от таблиц раздела «Таблицы». Изменения в одной никак не затрагивают другую.
Как открыть
Проект → Таблицы → кнопка SQL справа от «Добавить таблицу».

Вернуться к списку таблиц можно стрелкой в заголовке страницы.
Работать с разделом могут сотрудники с правом редактирования таблиц. С правом только на просмотр видна структура базы, данные и запросы недоступны.
Структура базы
Справа дерево базы: таблицы, их столбцы и индексы, ниже представления. У столбца показан тип, у ключевого столбца иконка ключа, у индекса признак UNIQUE и список столбцов.

Все действия со структурой в меню узла: правая кнопка мыши, значок «⋮» при наведении или кнопка «+» над деревом.
| Узел | Действия |
|---|---|
| База | создать таблицу, создать представление, обновить, скачать базу |
| Таблица | открыть, добавить столбец, добавить индекс, переименовать, DDL, обновить, удалить |
| Столбец | переименовать, удалить |
| Индекс | DDL, удалить |
| Представление | открыть, DDL, удалить |

Создать таблицу. Укажите название и столбцы: имя, тип, значение по умолчанию, признаки PK и NOT NULL. Тип можно выбрать из подсказок или ввести свой. Если отметить PK у нескольких столбцов, получится составной ключ.

DDL показывает CREATE-выражение объекта в консоли: удобно скопировать структуру или воспроизвести её в другом проекте.
Кнопки над деревом: создать, обновить, показать или скрыть консоль, DDL выбранной таблицы, скачать базу, очистить базу.

Данные таблицы
Клик по таблице в дереве открывает её данные. Грид работает так же, как лист в разделе «Таблицы»:
- Правка ячейки двойным кликом. Enter сохраняет, Esc отменяет. Значение записывается в базу сразу.
- Строки. Кнопка «+» добавляет пустую строку, «−» удаляет выделенные. Строка выделяется кликом по её номеру в первой колонке, Shift и Cmd/Ctrl выделяют несколько.
-
NULL показывается словом
NULL. Если стереть значение ячейки, в базу запишется пустая строка. Записать NULL можно запросом. - WHERE и ORDER BY над гридом принимают условие и порядок сортировки как в SQL: введите текст и нажмите Enter. Поле ORDER BY имеет приоритет над сортировкой из меню колонки.
- Меню колонки (значок в заголовке): сортировка по возрастанию и убыванию, фильтр по подстроке.
- Данные подгружаются по мере прокрутки, порциями по 100 строк. Счётчик справа показывает диапазон и общее число строк.
- Представления открываются только на чтение.
Консоль

Кнопка </> над деревом раскрывает консоль: редактор запросов с подсветкой и результат.
- Выполнить: кнопка или Ctrl+Enter (Cmd+Enter на Mac).
- Можно выполнить несколько запросов через
;. В результате показываются строки последнего запроса, вернувшего данные, и общее число изменённых строк. - Ошибка SQLite показывается как есть. В пакете запросов к ошибке добавляется номер запроса:
[2] no such table: .... - Избранное. Кнопка «В избранное» сохраняет текущий запрос под именем. Сохранённые запросы лежат чипами над редактором: клик подставляет запрос, крестик удаляет. Избранное хранится в вашем браузере отдельно для каждого проекта.
- Текст последнего запроса сохраняется между заходами.
Скачать и очистить базу
Скачать базу отдаёт файл project_<id>_sql.sqlite3 целиком. Его можно открыть любой программой для SQLite, перенести в другой проект или использовать вне Salebot.
Очистить базу удаляет все таблицы и данные раздела SQL. Действие необратимо и требует ввести слово подтверждения. Раздел «Таблицы» при этом не затрагивается.
Функции калькулятора
Из бота к базе раздела обращаются две функции калькулятора. Обе есть в подсказках редактора и известны ассистенту.
sql(query, params=null, strict=true)
Выполняет запрос.
| Запрос | Что вернётся |
|---|---|
| С результатом (SELECT, RETURNING, PRAGMA) | json-список строк, объект на строку: [{"id": 1, "name": "Анна"}, ...]
|
| Без результата (INSERT, UPDATE, DELETE) | число изменённых строк |
| CREATE, DROP и другие изменения структуры | 0 |
| Ошибка | строка ERROR: <текст ошибки SQLite>
|
Пример:
rows = sql("SELECT name, phone FROM clients WHERE city = ?", [city])
n = sql("UPDATE clients SET status = :s WHERE id = :id", {"s": "vip", "id": client_id})
sql_value(query, params=null, strict=true)
То же, что sql, но возвращает одно значение: первую колонку первой строки результата. Если строк нет, результата нет или значение NULL, вернётся пустая строка.
total = sql_value("SELECT count(*) FROM clients")
name = sql_value("SELECT name FROM clients WHERE id = ?", [client_id])
Параметры
params передаёт значения в запрос отдельно от его текста: json-массив для ? или json-объект для :name. Внутри [...] и {...} переменные пишутся голым именем:
[client_id], а не [#{client_id}].
Передавайте через params всё, что приходит от клиента: имя, телефон, текст сообщения. Значение, склеенное в текст запроса, может изменить сам запрос.
Режим strict
По умолчанию strict=true: функция принимает ровно один запрос и не допускает комментариев в его тексте. Так значение из сообщения клиента не сможет дописать к запросу второй или отрезать его хвост. strict=false снимает ограничение, например для пакета запросов через ;.
Ограничения
| Что | Значение |
|---|---|
| Время выполнения одного запроса или пакета | 5 секунд |
| Строк в результате | до 1000, остальные не отдаются |
| Длина текста запроса | 64 КБ |
| Размер базы | 200 МБ, после превышения доступны только чтение и удаление данных |
Запрещены только команды, выходящие за пределы базы проекта: ATTACH с указанием файла и VACUUM INTO. Всё остальное, включая обычный VACUUM, PRAGMA и транзакции, доступно.


