python - SQLAlchemy:引擎、连接和 session 的区别

标签 python session orm sqlalchemy psycopg2

我使用SQLAlchemy,至少有三个实体:enginesessionconnection,它们有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 语句的上下文,或者更常见的是,当您想要执行其他操作时,例如 INSERTDELETE

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/

相关文章:

python - SQLAlchemy 生成错误的 SQL(对于别名和自连接)?

python - `@numba.jitclass` ed 特殊方法去哪里了?

python - 删除元组的聪明方法

python - 使用 Python 在 Google App Engine 中提供 Google 配置 API 和 oAuth2

python - NLTK 中的 Wordnet 选择限制

java - 成功的 php session 需要什么?

php - 如何用不同的ip捕获同一个用户

java - Hibernate:两个属性中生成的值相同

php - 在 Codeigniter 中重定向后 session 丢失

java - JPA/Hibernate native 查询无法识别参数