一个简短的概述:
execute()
的行为在所有情况下都相同,但它们是 Engine
、Connection
和 Session
类中的 3 种不同方法。
execute()
究竟是什么:
要理解 execute()
的行为,我们需要查看 Executable
类。 Executable
是所有“语句”类型对象的超类,包括 select()、delete()、update()、insert()、text() - 简单来说,Executable
是 SQLAlchemy 支持的 SQL 表达式构造。
在所有情况下,execute()
方法接受 SQL 文本或构建的 SQL 表达式,即 SQLAlchemy 支持的各种 SQL 表达式构造,并返回查询结果(ResultProxy
- 包装了一个 DB-API
游标对象,以提供更轻松地访问行列。)
进一步澄清(仅用于概念上的澄清,不是推荐的方法):
除了Engine.execute()
(无连接执行)、Connection.execute()
和Session.execute()
之外,还可以直接在任何Executable
构造上使用execute()
。 Executable
类有自己的execute()
实现-根据官方文档,关于execute()
所做的事情的一行描述是“编译并执行此Executable
”。在这种情况下,我们需要将Executable
(SQL表达式构造)显式绑定到Connection
对象或Engine
对象(隐式获取Connection
对象),以便execute()
知道在哪里执行SQL
。
以下示例很好地演示了这一点-给定如下表:
from sqlalchemy import MetaData, Table, Column, Integer
meta = MetaData()
users_table = Table('users', meta,
Column('id', Integer, primary_key=True),
Column('name', String(50)))
显式执行即Connection.execute()
- 将SQL文本或构建的SQL表达式传递给Connection
的execute()
方法:
engine = create_engine('sqlite:///file.db')
connection = engine.connect()
result = connection.execute(users_table.select())
for row in result:
connection.close()
显式无连接执行,即通过将SQL文本或构建的SQL表达式直接传递给Engine的execute()
方法来执行:
engine = create_engine('sqlite:///file.db')
result = engine.execute(users_table.select())
for row in result:
result.close()
隐式执行即
Executable.execute()
- 也是无连接的,并调用
Executable
的
execute()
方法,即直接在
SQL
表达式构造(
Executable
的一个实例)上直接调用
execute()
方法。请注意保留HTML标记。
engine = create_engine('sqlite:///file.db')
meta.bind = engine
result = users_table.select().execute()
for row in result:
result.close()
注意:为了澄清,这里给出隐式执行的示例——这种执行方式极不推荐使用——如
docs 所述:
“隐式执行”是一种非常古老的使用模式,在大多数情况下更加混乱而不是有用,因此不建议使用。这两种模式似乎都鼓励在应用程序设计中过度使用方便的“捷径”,这会导致以后出现问题。
您的问题:
据我了解,如果有人使用engine.execute,它会创建连接,打开会话(Alchemy会为您处理),并执行查询。
您对“如果有人使用engine.execute
,它会创建connection
”这部分是正确的,但对于“打开session
(Alchemy会为您处理)并执行查询”则不正确。使用Engine.execute()
和Connection.execute()
几乎是相同的,正式来说,Connection
对象会隐式创建,在后一种情况下,我们明确地实例化它。在这种情况下真正发生的是:
`Engine` object (instantiated via `create_engine()`) -> `Connection` object (instantiated via `engine_instance.connect()`) -> `connection.execute({*SQL expression*})`
但是,这三种执行任务的方式之间是否存在全局差异呢?
在DB层面上,它们都执行SQL(文本表达式或各种SQL表达式结构),完全相同。从应用程序的角度来看,有两个选择:
- 直接执行 - 使用
Engine.execute()
或
Connection.execute()
- 使用
sessions
- 通过
session.add()
、
session.rollback()
、
session.commit()
和
session.close()
轻松处理事务作为单个工作单元进行高效处理。这是在ORM情况下与数据库交互的方式,即映射表。提供
identity_map,以便在单个请求期间立即获取已访问或新创建/添加的对象。
Session.execute()
最终使用
Connection.execute()
语句执行方法来执行SQL语句。在应用程序与数据库交互时,使用
Session
对象是SQLAlchemy ORM推荐的方式。
这是文档的一部分:
需要注意的是,当使用SQLAlchemy ORM时,通常不会直接访问这些对象;相反,Session对象用作与数据库交互的接口。但是,对于那些基于直接使用文本SQL语句和/或SQL表达式构造而没有ORM高级管理服务介入的应用程序来说,Engine和Connection是最重要的 - 继续阅读。
my_session.connection()
。文档:https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.connection。 - Nealconnection()
而不是connect
。请看我提供的文档链接。 - Neal