SQLAlchemy ORM - 文本 SQL
之前,我们从 SQLAlchemy 的核心表达式语言的角度解释了使用 text() 函数的文本 SQL。现在我们将从 ORM 的角度讨论它。
通过在 text() 构造中指定其用途,可以灵活地将文字字符串与 Query 对象一起使用。大多数适用方法都接受它。例如,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
从 Customers 表中的示例数据中,将选择两行,并将 name 列打印如下 −
Ravi Kumar Komal Pande
要使用基于字符串的 SQL 指定绑定参数,请使用冒号,要指定值,请使用 params() 方法。
cust = session.query(Customers).filter(text("id = :value")).params(value = 1).one()
Python 控制台上显示的有效 SQL 将如下所示 −
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
显然,将选择 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()
即使 SQLite 引擎执行以下由上述代码生成的表达式,也会选择所有行的 id 和 name 列,该表达式显示了 text() 方法中的所有列 −
SELECT name, id, name, address, email FROM customers