19

我熟悉 Python 生成器,但是我刚刚遇到了我不熟悉的术语“生成方法”,也找不到令人满意的定义。

为了把它放在上下文中,我在 SQLAlchemy 的叙述文档中找到了这个术语:

使用 Connection、Engine、Executable 上提供的生成 Connection.execution_options() 方法可以完全控制“自动提交”行为,使用“自动提交”标志将打开或关闭所选范围的自动提交。

什么是生成方法?尝试迭代返回的对象Connection.execution_options()不起作用,所以我认为它不是标准生成器。

4

4 回答 4

30

它似乎不是一个常见的数据库概念,但 SQLAlchemy在“由您的程序在运行时迭代生成”的意义上使用术语生成。(所以,没有连接到 python 生成器)。教程中的一个例子

Query对象是完全生成的,这意味着大多数方法调用都会返回一个新Query对象,可以在该对象上添加更多标准。例如,要查询全名为“Ed Jones”的名为“ed”的用户,您可以调用filter()两次,它使用 AND 连接条件:

>>> for user in session.query(User).\
...   filter(User.name=='ed').\
...   filter(User.fullname=='Ed Jones'):
...     print user

这种调用语法通常被称为“方法链接”,并且允许它作为“流利接口”的设计。

因此,在 的情况下Connection.execution_options(),“生成”意味着它返回修改后的连接对象,以便您可以像上面那样链接调用。

于 2012-04-07T10:13:52.623 回答
4

查看 Connection.execution_options (lib/sqlalchemy/engine/base.py) 的源代码,该方法所做的只是向连接添加选项。

这个想法是这些选项会影响例如查询的未来行为。

举个例子:

        result = connection.execution_options(stream_results=True).\
                            execute(stmt)

在这里,仅此查询的行为在连接中间发生了变化。在某种程度上,它“生成”或将自己克隆为具有略微不同行为的对象。

在这里,您还可以将自动提交设置为 True。例子

# obtain a connection
connection = ...
# do some stuff
# for the next section we want autocommit on
autocommitting_connection = connection.execution_options(autocommit=True)
autocommitting_connection.execute(some_insert)
result = autocommitting_connection.execute(some_query)
# done with this section. Continue using connection (no autocommit)

这就是文档的该部分的含义。“生成方法”是指返回可以继续使用的同一实例的修改副本的方法。这适用于 Connection、Engine、Executable 类。

于 2012-04-08T10:48:40.883 回答
3

您必须查阅该项目的特定文档或源代码才能真正确定,但我猜它会返回某个对象的修改版本,该版本适合参数定义的要求/行为。

文档指出:

该方法返回 this 的副本,该副本Connection引用相同的底层 DBAPI 连接,但还定义了给定的执行选项,这些选项将对execute().

于 2012-04-05T02:44:26.647 回答
0

正如上面的@zzzeek 评论,这现在记录在 SQLAlchemy词汇表中。

生成的意思:

SQLAlchemy 用来指代通常称为方法链接的术语;有关详细信息,请参阅该术语。

方法链是:

一种面向对象的技术,通过调用对象上的方法来构造对象的状态。该对象具有任意数量的方法,每个方法都返回一个新对象(或在某些情况下是同一个对象),并为该对象添加了额外的状态。

于 2016-09-13T10:19:27.067 回答