Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

execute

box.execute(sql-statement[, extra-parameters])

Выполняет SQL-запрос, переданный в параметре sql-statement.

Параметры:

  • sql-statement (string) — запрос, который должен соответствовать правилам SQL-грамматики
  • extra-parameters (table) — необязательная таблица для плейсхолдеров в запросе

Возвращает

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

Передать дополнительные параметры в box.execute() можно двумя способами:

  • Первый способ, который является предпочтительным, — поместить в строку плейсхолдеры и передать второй аргумент — таблицу extra-parameters. Плейсхолдер — это либо знак вопроса "?", либо двоеточие ":", за которым следует имя. Дополнительный параметр — это любое Lua-выражение.

    Если плейсхолдеры — знаки вопроса, то они заменяются значениями extra-parameters в соответствующих позициях. То есть первый ? заменяется первым дополнительным параметром, второй ? — вторым дополнительным параметром и так далее.

    Если плейсхолдеры — это :имена, то они заменяются значениями extra-parameters с соответствующими именами.

    Например, этот запрос, содержащий литеральные значения 1 и 'x':

    box.execute([[INSERT INTO tt VALUES (1, 'x');]]);

    ... то же самое, что и запрос ниже, содержащий два плейсхолдера-знака вопроса (? и ?) и таблицу extra-parameters из двух элементов:

    x = {1,'x'}box.execute([[INSERT INTO tt VALUES (?, ?);]], x);

    ... и то же самое, что и этот запрос, содержащий два плейсхолдера :имя (:a и :b) и таблицу extra-parameters из двух элементов с именами "a" и "b":

    box.execute([[INSERT INTO tt VALUES (:a, :b);]], {{[':a']=1},{[':b']='x'}})
  • Второй способ — конкатенация строк. Например, приведенный ниже Lua-скрипт вставляет 10 строк с разными значениями первичного ключа в таблицу t:

    for i=1,10,1 do    box.execute("insert into t values (" .. i .. ")")end

    При создании SQL-запросов на основе пользовательского ввода разработчикам приложений следует остерегаться SQL-инъекций.

Поскольку box.execute() — это вызов Lua-функции, она либо вызывает сообщение об ошибке, либо возвращает значение.

Для некоторых запросов возвращаемое значение содержит поле с именем rowcount, например:

tarantool> box.execute([[CREATE TABLE table1 (column1 INT PRIMARY key, column2 VARCHAR(10));]])---- rowcount: 1...tarantool> box.execute([[INSERT INTO table1 VALUES (55,'Hello SQL world!');]])---- rowcount: 1...

Для запросов, которые вызывают генерацию значений для колонок PRIMARY KEY AUTOINCREMENT, есть поле с именем autoincrement_id.

Для запросов SELECT или PRAGMA возвращаемое значение — это результирующий набор, содержащий поле с именем metadata (таблица с именами колонок и именами типов Tarantool/NoSQL) и поле с именем rows (таблица с содержимым каждой строки).

Например, для запроса SELECT "x" FROM t WHERE "x"=5;, где "x" — колонка INTEGER и есть одна строка, вывод на клиенте Tarantool может выглядеть так:

tarantool> box.execute([[SELECT "x" FROM t WHERE "x"=5;]])---- metadata:  - name: x    type: integer  rows:  - [5]...

Чтобы посмотреть сырой формат результатов SELECT, см. Бинарный протокол – ответы для SQL.

Порядок компонентов внутри map не гарантируется.

Если sql_full_metadata в системной таблице _session_settings имеет значение TRUE, то метаданные результирующего набора могут включать, помимо name и type, следующие элементы:

  • collation (присутствует только если для STRING указано предложение COLLATE) = "Правила сортировки".
  • is_nullable (присутствует только если список выборки указывает колонку базовой таблицы и ничего больше) = false, если колонка была определена как NOT NULL, иначе true. Если этого поля нет, это означает, что nullability неизвестна.
  • is_autoincrement (присутствует только если список выборки указывает колонка базовой таблицы и ничего больше) = true, если колонка была определена как PRIMARY KEY AUTOINCREMENT, иначе false.
  • span (присутствует всегда) = исходное выражение в списке выборки, которое часто совпадает с name, если список выборки указывает имя колонки и ничего больше, но в остальных случаях отличается, например, после SELECT x+55 AS x FROM t; name — это X, а span — это x+55. Если span и name совпадают, то содержимое — MP_NIL.

Альтернатива: если вы используете сервер Tarantool в качестве клиента, вы можете переключить язык следующим образом:

\set language sql\set delimiter ;

После этого можно вводить любой SQL-запрос напрямую, без необходимости в box.execute().

Есть также функция execute() в модуле net.box. Например, можно выполнить conn:execute(sql-statement]) после conn = net_box.connect(url-string).