📅  最后修改于: 2020-11-27 07:49:06             🧑  作者: Mango
先前,已经从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
从客户表中的示例数据中,将选择两行,并将名称列打印如下:
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
显然,将选择“客户”表中的所有记录。
通过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引擎执行由上述代码生成的以下表达式显示text()方法中的所有列,也将选择所有行的id和name列-
SELECT name, id, name, address, email FROM customers