什么是生成方法?

时间:2012-04-05 02:29:12

标签: python sqlalchemy

我熟悉Python生成器,但是我只是遇到了“生成方法”这个术语,我不熟悉它并且找不到令人满意的定义。

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

  

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

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

4 个答案:

答案 0 :(得分:30)

它似乎不是一个常见的数据库概念,但SQLAlchemy使用术语 generative ,意思是“程序在运行时迭代生成”。 (所以,没有与python生成器的连接)。来自the tutorial:

的示例
  

Query对象完全生成,意味着大多数方法调用   返回一个新的Query对象,可以在其上添加更多标准。   例如,要查询名为“ed”的用户,其全名为“Ed”   Jones“,你可以两次调用filter(),使用AND加入标准:

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

这种调用语法通常称为“方法链接”,以及允许它作为"fluent interface"的设计。

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

答案 1 :(得分: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类。

答案 2 :(得分:3)

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

documentation州:

  

该方法返回此Connection的副本,该副本引用相同的内容   底层DBAPI连接,但也定义了给定的执行   选项将对execute()的调用生效。

答案 3 :(得分:0)

正如@zzzeek在上面评论的那样,现在在SQLAlchemy glossary中记录了这一点。

generative表示:

  

SQLAlchemy用来引用通常称为方法链的术语;请参阅该术语了解详情。

method chaining是:

  

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