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

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

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

В приведенном ниже примере метод filter () переводит строку «id <3» в WHERE id <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 = ?

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

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 () -

SELECT name, id, name, address, email FROM customers