execute
Выполняет 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 dobox.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: xtype: integerrows:- [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).