Учебники

SQLAlchemy ORM — текстовый SQL

Ранее текстовый SQL с использованием функции text () был объяснен с точки зрения основного языка выражений SQLAlchemy. Теперь мы обсудим это с точки зрения ORM.

Литеральные строки могут гибко использоваться с объектом Query, определяя их использование с помощью конструкции text (). Большинство применимых методов принимают это. Например, filter () и order_by ().

В приведенном ниже примере метод filter () переводит строку «id <3» в идентификатор WHERE <3

from sqlalchemy import text
for cust in session.query(Customers).filter(text("id<3")):
   print(cust.name)

Сгенерированное необработанное выражение SQL показывает преобразование фильтра в предложение WHERE с помощью приведенного ниже кода:

SELECT customers.id 
AS customers_id, customers.name 
AS customers_name, customers.address 
AS customers_address, customers.email 
AS customers_email
FROM customers
WHERE id<3

Из наших примеров данных в таблице «Клиенты» будут выбраны две строки и столбец с именем будет напечатан следующим образом:

Ravi Kumar
Komal Pande

Чтобы указать параметры связывания с SQL на основе строк, используйте двоеточие, а для указания значений используйте метод params ().

cust = session.query(Customers).filter(text("id = :value")).params(value = 1).one()

Эффективный SQL, отображаемый на консоли Python, будет таким, как указано ниже —

SELECT customers.id 
AS customers_id, customers.name 
AS customers_name, customers.address 
AS customers_address, customers.email 
AS customers_email
FROM customers
WHERE id = ?

Чтобы использовать полностью строковый оператор, в метод from_statement () можно передать конструкцию text (), представляющую полный оператор.

session.query(Customers).from_statement(text("SELECT * FROM customers")).all()

Результат приведенного выше кода будет основным оператором SELECT, как показано ниже:

SELECT * FROM customers

Очевидно, что все записи в таблице клиентов будут выбраны.

Конструкция text () позволяет позиционно связать его текстовый SQL с выражениями столбца Core или ORM. Мы можем достичь этого, передавая выражения столбцов в качестве позиционных аргументов в метод TextClause.columns ().

stmt = text("SELECT name, id, name, address, email FROM customers")
stmt = stmt.columns(Customers.id, Customers.name)
session.query(Customers.id, Customers.name).from_statement(stmt).all()

Столбцы id и name всех строк будут выбраны, даже если механизм SQLite выполняет следующее выражение, сгенерированное приведенным выше кодом, и отображает все столбцы в методе text () —