Sqlalchemy 简明教程
SQLAlchemy Core - Using Textual SQL
对于已知 SQL 的情况且无需语句支持动态特征的情况,SQLAlchemy 允许你仅使用字符串。text() 构造被用于编写传递到数据库的大致没有修改的文本语句。
它构造一个新的 TextClause ,表示直接作为文本 SQL 字符串,如下面的代码所示:
from sqlalchemy import text
t = text("SELECT * FROM students")
result = connection.execute(t)
text() 相较于简单字符串提供的优势包括:
-
后端中立支持绑定参数
-
per-statement execution options
-
result-column typing behaviour
text() 函数需要名结肠号格式的绑定参数。它们与数据库后端无关。要向参数发送值,我们以附加参数的形式将它们传递到 execute() 方法中。
以下示例在文本 SQL 中使用了绑定参数:
from sqlalchemy.sql import text
s = text("select students.name, students.lastname from students where students.name between :x and :y")
conn.execute(s, x = 'A', y = 'L').fetchall()
text() 函数构造 SQL 表达式,如下所示:
select students.name, students.lastname from students where students.name between ? and ?
x = ’A’ 和 y = ’L’ 的值作为参数传递。结果是名字在“A”和“L”之间的行列表
[('Komal', 'Bhandari'), ('Abdul', 'Sattar')]
text() 构造使用 TextClause.bindparams() 方法支持预先建立的边界值。也可以按以下方式明确设置参数的类型 -
stmt = text("SELECT * FROM students WHERE students.name BETWEEN :x AND :y")
stmt = stmt.bindparams(
bindparam("x", type_= String),
bindparam("y", type_= String)
)
result = conn.execute(stmt, {"x": "A", "y": "L"})
The text() function also be produces fragments of SQL within a select() object that
accepts text() objects as an arguments. The “geometry” of the statement is provided by
select() construct , and the textual content by text() construct. We can build a statement
without the need to refer to any pre-established Table metadata.
from sqlalchemy.sql import select
s = select([text("students.name, students.lastname from students")]).where(text("students.name between :x and :y"))
conn.execute(s, x = 'A', y = 'L').fetchall()
您还可以使用 and_() 函数组合在 WHERE 子句中创建的多个条件,该子句是在 text() 函数的帮助下创建的。
from sqlalchemy import and_
from sqlalchemy.sql import select
s = select([text("* from students")]) \
.where(
and_(
text("students.name between :x and :y"),
text("students.id>2")
)
)
conn.execute(s, x = 'A', y = 'L').fetchall()
上面的代码提取了 id 大于 2 的姓名介于“A”和“L”之间的行。代码的输出如下 -
[(3, 'Komal', 'Bhandari'), (4, 'Abdul', 'Sattar')]