SQLAlchemy позволяет вам просто использовать строки, для тех случаев, когда SQL уже известен и нет сильной необходимости в операторе для поддержки динамических функций. Конструкция text () используется для составления текстового оператора, который в основном передается в базу данных без изменений.
Он создает новое TextClause , представляющее текстовую строку SQL напрямую, как показано в приведенном ниже коде —
from sqlalchemy import text t = text("SELECT * FROM students") result = connection.execute(t)
Преимущества text () перед простой строкой:
- Нейтральная поддержка параметров привязки
- варианты исполнения для каждого оператора
- тип поведения столбца результата
Для функции text () требуются параметры Bound в указанном формате двоеточия. Они согласованы независимо от базы данных. Чтобы отправить значения параметров, мы передаем их в метод execute () в качестве дополнительных аргументов.
В следующем примере используются связанные параметры в текстовом SQL —
from sqlalchemy.sql import text s = text("select students.name, students.lastname from students where students.name between 😡 and :y") conn.execute(s, x = 'A', y = 'L').fetchall()
Функция text () создает выражение SQL следующим образом:
select students.name, students.lastname from students where students.name between ? and ?
Значения x = ‘A’ и y = ‘L’ передаются как параметры. Результатом является список строк с именами между ‘A’ и ‘L’ —
[('Komal', 'Bhandari'), ('Abdul', 'Sattar')]
Конструкция text () поддерживает предварительно установленные значения привязки с помощью метода TextClause.bindparams (). Параметры также могут быть явно введены следующим образом:
stmt = text("SELECT * FROM students WHERE students.name BETWEEN 😡 AND :y") stmt = stmt.bindparams( bindparam("x", type_= String), bindparam("y", type_= String) ) result = conn.execute(stmt, {"x": "A", "y": "L"}) The text() function also be produces fragments of SQL within a select() object that accepts text() objects as an arguments. The “geometry” of the statement is provided by select() construct , and the textual content by text() construct. We can build a statement without the need to refer to any pre-established Table metadata. from sqlalchemy.sql import select s = select([text("students.name, students.lastname from students")]).where(text("students.name between 😡 and :y")) conn.execute(s, x = 'A', y = 'L').fetchall()
Вы также можете использовать функцию and_ () для объединения нескольких условий в предложении WHERE, созданном с помощью функции text ().
from sqlalchemy import and_ from sqlalchemy.sql import select s = select([text("* from students")]) \ .where( and_( text("students.name between 😡 and :y"), text("students.id>2") ) ) conn.execute(s, x = 'A', y = 'L').fetchall()
Выше код выбирает строки с именами между «A» и «L» с id больше 2. Вывод кода приведен ниже —