我使用SQLAlchemy,至少有三个实体:engine
、session
和connection
,它们有execute
方法,所以如果我例如想从 table
中选择所有记录我可以这样做
engine.execute(select([table])).fetchall()
还有这个
connection.execute(select([table])).fetchall()
甚至这个
session.execute(select([table])).fetchall()
- 结果是一样的。
据我了解,如果有人使用 engine.execute
,它会创建 connection
,打开 session
(Alchemy 会为您处理)并执行查询。但是,这三种执行此类操作的方式之间是否存在全局差异?
任务?
最佳答案
Nabeel's answer涵盖了很多细节并且很有帮助,但我发现它令人困惑。由于这是目前针对此问题的第一个 Google 结果,因此为以后发现此问题的人补充我对它的理解:
运行 .execute()
正如 OP 和 Nabell Ahmed 都指出的那样,在执行纯 SELECT * FROM tablename
时,提供的结果没有区别。
这三个对象之间的差异确实变得很重要,具体取决于使用 SELECT
语句的上下文,或者更常见的是,当您想要执行其他操作时,例如 INSERT
、DELETE
等
Engine、Connection、Session一般什么时候使用
Engine 是 SQLAlchemy 使用的最低级别的对象。它maintains a pool of connections每当应用程序需要与数据库通信时都可以使用。
.execute()
是一种方便的方法,首先调用conn = engine.connect(close_with_result=True)
然后是conn.execute()
. close_with_result 参数表示连接自动关闭。 (我稍微解释了源代码,但基本上是真的)。 编辑:Here's the source code for engine.execute您可以使用引擎执行原始 SQL。
result = engine.execute('SELECT * FROM tablename;') #what engine.execute() is doing under the hood conn = engine.connect(close_with_result=True) result = conn.execute('SELECT * FROM tablename;') #after you iterate over the results, the result and connection get closed for row in result: print(result['columnname'] #or you can explicitly close the result, which also closes the connection result.close()
这在 basic usage 下的文档中有介绍.
Connection 是(正如我们在上面看到的)实际执行 SQL 查询工作的东西。每当您想要更好地控制连接的属性、连接何时关闭等时,您都应该这样做。例如,一个非常重要的示例是 Transaction ,它使您可以决定何时将更改提交到数据库。在正常使用中,更改是自动提交的。通过使用事务,您可以(例如)运行多个不同的 SQL 语句,如果其中一个出现问题,您可以一次撤消所有更改。
connection = engine.connect() trans = connection.begin() try: connection.execute("INSERT INTO films VALUES ('Comedy', '82 minutes');") connection.execute("INSERT INTO datalog VALUES ('added a comedy');") trans.commit() except: trans.rollback() raise
如果其中一项失败,这将让您撤消这两项更改,例如您忘记创建数据记录表。
因此,如果您正在执行原始 SQL 代码并需要控制,请使用连接
Sessions 用于 SQLAlchemy 的对象关系管理 (ORM) 方面(实际上,您可以从它们的导入方式中看到这一点:
from sqlalchemy.orm import sessionmaker
)。他们在后台使用连接和事务来运行自动生成的 SQL 语句。.execute()
是一个方便的函数,它传递到 session 绑定(bind)的任何对象(通常是引擎,但也可以是连接)。如果您使用 ORM 功能,请使用 session;如果您只执行未绑定(bind)到对象的直接 SQL 查询,则最好直接使用连接。
关于python - SQLAlchemy:引擎、连接和 session 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34322471/