Bootstrap

SQLAlchemy中session.execute执行select和text的区别

在SQLAlchemy中,stmt 是一个表示SQL查询的对象,可以是查询构造器,也可以是文本查询。这两种情况在执行时的主要区别在于它们如何被构造和执行。

1. 使用 text

这行代码使用 text 函数创建了一个文本查询对象。text 函数用于创建一个SQL文本查询,其中包含的字符串会被当作SQL命令执行。在这个例子中,它执行了一个简单的SELECT查询,选择了 users 表中的所有列。

执行过程:

  1. 定义一个SQL字符串。
  2. 将这个字符串传递给text函数,生成一个TextClause对象。
  3. 调用session.execute()并传入TextClause对象。
  4. 返回一个结果集,通常是一个包含元组的列表。

代码示例:

from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///example.db')
Session = sessionmaker(bind=engine)
session = Session()
# 使用text执行查询
stmt = text("SELECT * FROM users WHERE id = :id")
result = session.execute(stmt, {'id': 1})
for row in result:
    print(row) # 这里row是元组,每个元素对应一行数据的多个列

2. 使用 select

当你使用SQLAlchemy的表达式语言时,你使用的是ORM的功能,可以构建更加安全和灵活的查询。
执行过程:

  1. 使用SQLAlchemy的API(如select)来构建一个查询。
  2. 调用session.execute()并传入这个查询对象。
  3. 返回一个结果集,通常是一个包含模型实例的列表。

代码示例:

from sqlalchemy import create_engine, select
from sqlalchemy.orm import sessionmaker
from some_model import SomeModel  # 假设这是一个定义好的模型
engine = create_engine('sqlite:///example.db')
Session = sessionmaker(bind=engine)
session = Session()
# 使用select执行查询
stmt = select(users).filter(SomeModel.id == 1)
result = session.execute(stmt)
for row in result:
    print(row) # 这里users模型的一个实例

两者的主要区别在于:

  1. 查询构造器select 查询构造器是面向对象的,它与SQLAlchemy的ORM模型系统紧密集成。使用查询构造器时,您可以利用ORM模型中的属性名来访问表中的列,这有助于减少SQL注入的风险,并且可以利用ORM提供的其他功能,如参数绑定、子查询、联合查询等。
  2. 文本查询text 函数创建的文本查询是面向文本的,它不与ORM模型系统集成。这意味着您需要手动编写SQL语句,并确保进行适当的参数绑定以避免SQL注入。文本查询在执行时通常会直接转换为SELECT语句,并且不支持ORM模型属性名访问。
    在性能方面,两者通常不会有显著差异,因为最终它们都会被转换为相同的SQL命令。然而,在开发过程中,使用查询构造器通常更加安全和方便,因为它可以利用ORM提供的功能和便利性。
;