Раздел 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 и транзакции, доступно.