2012-04-05 11 views
19

私はPythonジェネレータに精通していますが、私は慣れていない "生成方法"という言葉に遭遇しました。満足できる定義を見つけることができません。 、生成メソッドとは何ですか?

「自動コミット」行動のフルコントロールが生成的Connection.execution_optionsを使用して利用可能である()メソッドの接続、エンジンに提供:

はコンテキストにそれを置くために、私はSQLAlchemyのの物語文書中の用語を見つけました選択可能なスコープの自動コミットをオンまたはオフにする "autocommit"フラグを使用して実行可能です。

どのような生成方法はありますか? Connection.execution_options()によって返されたオブジェクトを反復しようとすると機能しませんので、私はそれが標準のジェネレータ以外のものであると考えています。

+0

いくつかのグーグルでは、それがコード生成の話をすることができ示唆して、それは考えにくい... http://www.program-transformation.org/Transform/GenerativeProgrammingWiki – jimw

+0

それはPythonのジェネレータを意味するものではありません、それは確かです。このメソッドは接続状態を変更するためのもので、シーケンスを生成するのは意味がありません。 – alexis

答えて

30

一般的なデータベースの概念ではありませんが、SQLAlchemyのは「反復的に実行時にプログラムによって生成された」という意味で用語生成的を使用しています。 (したがって、Pythonジェネレータとの接続はありません)。 Queryオブジェクトthe tutorial:

の例は、ほとんどの方法は、さらに、基準が添加されてもよいその上に新しいQueryオブジェクトを返す 呼び出すことを意味完全生成的、あります。たとえば、あなたが使用して基準を接合する、二回filter()を呼び出すことができ、「エド ・ジョーンズ」の完全な名前を持つ「ED」という名前のユーザーのためのクエリとする :

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

この呼び出し構文がより一般的です「方法連鎖」として知られており、それを可能にする設計は"fluent interface"です。

したがって、Connection.execution_options()の場合、「生成」とは、変更された接続オブジェクトを返すことを意味します。そのため、上記のように呼び出しをチェーンすることができます。

+1

また、SQL文を断片的に「生成」します。 – Keith

+0

はい、その他のあらゆる種類のオブジェクト。 SQL文は、 'Query'がカプセル化するものです。 – alexis

+1

よろしくお願いします。その用語をドキュメントに追加したいかもしれません – zzzeek

3

実際に確認するには、そのプロジェクトの特定のドキュメントまたはソースコードを調べる必要がありますが、引数によって定義された要件/動作に適合したオブジェクトの修正バージョンが返されると思います。

documentation状態:

方法は同じ 基礎となるDBAPIコネクションを参照するこのConnectionのコピーを返しますが、また​​への呼び出しのために有効になります与えられた実行 オプションを定義します。

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の各クラスに適用されます。

+0

変更が「このクエリのみ」であることをあまり確かめないでください。オプションのいくつかは、基礎となる接続オブジェクトに影響を与えます。 – alexis

+0

@alexisこの例では( "Here")これはこのクエリのためのものです。接続は生成メソッドによって変更されることはありませんが、変更されたコピーが返されます。基本的な接続オブジェクトが本当に影響を受ける例を気にしない限り。 – j13r

+0

http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.base.Connection.execution_optionsによると、 'isolation_level'の変更は、基礎となる接続が閉じられるまで続きます。 – alexis

0

これは、@zzzeekの上記のコメントと同様に、これはSQLAlchemy glossaryに記載されています。

generativeは意味:

SQLAlchemyのは、通常のメソッドチェーンとして知られているもの参照するために使用する用語を、詳細については、その用語を参照してください。

そしてmethod chainingある:

オブジェクトの状態は、オブジェクトのメソッドを呼び出すことによって構築されるオブジェクト指向技術。オブジェクトには任意の数のメソッドがあり、それぞれがオブジェクトに追加された状態で新しいオブジェクト(場合によっては同じオブジェクト)を返します。

関連する問題