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