Кросс-языковые переменные
В Tengri реализован специальный синтаксис для единообразного задания переменных в SQL и в Python. Эти переменные задаются на уровне ноутбука, и их можно использовать в любых ячейках независимо от языка.
Значения переменных задаются через графический интерфейс во вкладке Переменные. Имена переменных появляются в списке в этой вкладке в тот момент, когда конструкция с ними записывается в ячейку с кодом. Чтобы создать переменную, достаточно просто записать ее в коде — никаких специальных действий для инициализации не требуется.
Переменные можно использовать в коде в двух вариантах: в виде строковых значений и в виде "сырых" значений.
Указание дефолтного значения
При необходимости можно указать дефолтное значение, которое примет переменная, если оставить поле для значения данной переменной во вкладке Переменные пустым.
Синтаксис SQL и Python:
{@ variable_name | default_value @}
{@ raw variable_name | default_value @}
Примеры
Запишем через графический интерфейс в переменную my_var значение my_value.
Выполним код в ячейке типа Python, используя строковые значения:
print({@ my_var @})
my_value
Выполним код в ячейке типа SQL, используя строковые значения:
SELECT {@ my_var @} AS my_column
+-----------+
| my_column |
+-----------+
| my_value |
+-----------+
Выполним код в ячейке типа Python, используя "сырые" значения:
print({@ raw my_var @}) # Error expected
NameError: name 'my_value' is not defined
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[12], line 1
----> 1 print(my_value)
NameError: name 'my_value' is not defined
Ожидаемо получаем ошибку NameError, так как переменная с именем my_value не была задана.
Зададим эту переменную и выведем ее значение:
{@ raw my_var @} = 2025
print({@ raw my_var @})
2025
Выполним код в ячейке типа SQL, используя "сырые" значения:
SELECT {@ raw my_var @} AS my_column -- Error expected
ERROR: BinderException: Binder Error: Referenced column "my_value" not found in FROM clause!
Ожидаемо получаем ошибку BinderException, так как в запросе есть колонка my_value, но ее нет в таблице, откуда делается SELECT.
Выполним код в ячейке типа SQL, используя "сырые" значения, но так, чтобы "сырое" значение переменной задавало имя колонки:
SELECT 2025 AS {@ raw my_var @}
+----------+
| my_value |
+----------+
| 2025 |
+----------+
Оставим поле для значения переменной пустым и выполним код в ячейке типа SQL:
SELECT {@ my_var | my_default_value @} AS my_column
+------------------+
| my_column |
+------------------+
| my_default_value |
+------------------+
Использование кросс-языковых переменных возможно в том числе в случае интерполяции строк в Python:
print(f'my_var: {{@ my_var @}}')
print('my_var: {}'.format({@ my_var @}))
my_var: my_value
my_var: my_value