Ранее текстовый 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 () —