当前位置: 首页 > 面试题库 >

SQLAlchemy:引擎,连接和会话的区别

丁雅逸
2023-03-14
问题内容

我使用SQLAlchemy并至少有三个实体:enginesession并且connection,其中有execute方法,所以如果我如想选择所有记录,从table我能做到这一点

engine.execute(select([table])).fetchall()

和这个

connection.execute(select([table])).fetchall()

甚至这个

session.execute(select([table])).fetchall()

-结果将是相同的。

据我了解,如果有人使用engine.executeconnection,它会创建,打开session(Alchemy会为您处理)并执行查询。但是,执行此任务的这三种方式之间是否存在全局差异?


问题答案:

单行概述:

的行为execute()是在所有情况下相同,但它们是3种不同的方法,在EngineConnectionSession类。

到底是什么execute()

要了解行为,execute()我们需要调查Executable该类。Executable是所有“语句”类型对象的超类,包括select(),delete(),update(),insert(),text()-用最简单的词来说,Executable是SQLAlchemy支持的SQL表达式构造。

在所有情况下,该execute()方法均采用SQL文本或构造的SQL表达式,即SQLAlchemy支持的各种SQL表达式构造,并返回查询结果(ResultProxya-包装DB- API游标对象以更轻松地访问行列。)

为了进一步澄清(仅用于概念澄清,而不是建议的方法)

除了Engine.execute()(无连接执行),Connection.execute()和之外Session.execute(),还可以execute()直接在任何Executable构造上使用。该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表达式传递给以下execute()方法Connection

engine = create_engine('sqlite:///file.db')
connection = engine.connect()
result = connection.execute(users_table.select())
for row in result:
    # ....
connection.close()

显式无连接执行,Engine.execute()-将SQL文本或构造的SQL表达式直接传递给execute()Engine方法:

engine = create_engine('sqlite:///file.db')
result = engine.execute(users_table.select())
for row in result:
    # ....
result.close()

隐式执行(
Executable.execute()-)也是无连接的,并调用的execute()方法Executable,即它execute()直接在SQL表达式构造(的实例Executable)本身上调用方法。

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(炼金术会为您关心),并执行查询”,您是正确的-
在形式上,使用Engine.execute()Connection.execute()(几乎)是同一件事,在形式上,Connection隐式创建对象,在以后的情况下,我们显式实例化它。在这种情况下真正发生的是:

`Engine` object (instantiated via `create_engine()`) -> `Connection` object (instantiated via `engine_instance.connect()`) -> `connection.execute({*SQL expression*})`

但是,执行任务的这三种方式之间是否存在全局差异?

在数据库层,这完全是同一回事,所有这些都在执行SQL(文本表达式或各种SQL表达式构造)。从应用程序的角度来看,有两个选项:

  • 直接执行-使用Engine.execute()Connection.execute()
  • 使用sessions-通过有效地处理交易单单元的工作,轻松session.add()session.rollback()session.commit()session.close()。在ORM(即映射表)的情况下,这是与DB进行交互的方式。提供identity_map,以便在单个请求期间立即获取已被访问的对象或新创建/添加的对象。

Session.execute()最终使用Connection.execute()语句执行方法来执行SQL语句。使用Session对象是SQLAlchemy
ORM推荐的应用程序与数据库进行交互的方式。

文档摘录:

重要的是要注意,在使用SQLAlchemy
ORM时,通常不访问这些对象。而是将Session对象用作数据库的接口。但是,对于围绕直接使用文本SQL语句和/或SQL表达式构造而无需ORM更高级别的管理服务参与的应用程序,“引擎”和“连接”为王(也是王后?),请继续阅读。



 类似资料:
  • 我一直在读这个和这个。读完后,我发现自己现在对我的基础知识非常困惑。请帮助我,因为它涉及到网络和JSP的基础知识 考虑这个假设的情况: 如果我打开一些www.xyz。com在某个浏览器上,一天之内不要在该页面上做任何事情。 问题1:如果第二天我从该页面请求一些内容,这是否意味着相同的连接仍然存在。考虑到联系:保持活力是存在的。 问题2.会话在这种情况下是如何工作的?我发现,如果会话过期,连接也会过

  • 如何配置日志记录? 如何池数据库连接?我的关系合并了吗? 如何将自定义连接参数传递到数据库API? “MySQL服务器已经消失” “命令不同步;现在不能运行此命令”/“此结果对象不返回行。它已自动关闭” 如何自动“重试”语句执行? 使用DBAPI Autocommit允许透明重新连接的只读版本 为什么SQLAlchemy会发布这么多回滚? 我在Myisam上-我怎么关掉它? 我在SQL Serve

  • 引擎配置 支持的数据库 数据库URL 《PostgreSQL》 MySQL 甲骨文公司 Microsoft SQL服务器 SQLite 其他 引擎创建API 池化 自定义DBAPI connect()参数/on connect例程 传递给的特殊关键字参数数据库接口() 控制如何将参数传递给DBAPI connect()函数 在连接后修改DBAPI连接,或在连接后运行命令 完全替换DBAPI con

  • 本文向大家介绍sqlalchemy Engine(引擎),包括了sqlalchemy Engine(引擎)的使用技巧和注意事项,需要的朋友参考一下 示例 该引擎用于使用连接URL连接到不同的数据库: 但是请注意,引擎在首次使用之前不会真正建立连接。 该引擎会自动创建一个连接池,但是会延迟打开新连接(即,如果您仅要求一个,SQLAlchemy将不会打开5个连接)。

  • SQLAlchemy 1.4 / 2.0 Tutorial 此页是 SQLAlchemy 1.4/2.0教程 . 上一页: SQLAlchemy 1.4/2.0教程 |下一步: |next| 建立连接-引擎 任何SQLAlchemy应用程序的开始都是一个名为 Engine . 此对象充当连接到特定数据库的中心源,提供工厂和称为 connection pool 对于这些数据库连接。引擎通常是一个只为

  • 嗨,我正试图通过ssh隧道连接到服务器上的数据库,但我甚至无法连接Jsch会话。我试图在GWT中作为我的后端代码的一部分来做这件事。这是服务器端代码的实现部分。我对服务器一般不是那么熟悉。通常在端子I类型中: ssh-x username@xxxx.xxx.edu 然后系统提示我输入密码,我输入密码,然后我就进入了。 所以在java中我的代码如下: 我已经双重检查了用户名、密码和主机字符串,它们都