Учебники

Ядро SQLAlchemy — Использование текстового SQL

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. Вывод кода приведен ниже —