1行の概要:
挙動は、execute()すべての場合に同じであるが、彼らは3種類の方法、であるEngine、ConnectionとSessionクラス。
正確には何ですかexecute():
の動作を理解するにexecute()は、Executableクラスを調べる必要があります。Executableselect()、delete()、update()、insert()、text()を含むすべての「ステートメント」タイプのオブジェクトのスーパークラスです。最も簡単な言葉で言えば、ExecutableSQLAlchemyでサポートされているSQL式構成です。
すべての場合において、execute()メソッドはSQLテキストまたは構築されたSQL式、つまりSQLAlchemyでサポートされているさまざまなSQL式構成のいずれかを取り、クエリ結果を返します(ResultProxya- DB-APIカーソルオブジェクトをラップして、行列に簡単にアクセスできるようにします)。
それをさらに明確にするために(概念的な明確化のためにのみ、推奨されるアプローチではありません):
Engine.execute()(コネクションレス実行)、、Connection.execute()およびSession.execute()に加えてexecute()、任意のExecutable構成要素で直接を使用することもできます。Executableクラスは、それがの独自の実装のしているexecute()-公式ドキュメントを1として、どの程度1行の説明execute()ない「ですコンパイルし、これを実行しますExecutable」。この場合、Executable(SQL式構成)をConnectionオブジェクトまたはEngineオブジェクト(暗黙的にConnectionオブジェクトを取得する)に明示的にバインドする必要があるため、execute()はを実行する場所を認識しSQLます。
次の例はそれをうまく示しています-以下のようなテーブルが与えられます:
from sqlalchemy import MetaData, Table, Column, Integer
meta = MetaData()
users_table = Table('users', meta,
Column('id', Integer, primary_key=True),
Column('name', String(50)))
明示的な実行、つまりConnection.execute()SQLテキストまたは構築されたSQL式を次のexecute()メソッドに渡しますConnection。
engine = create_engine('sqlite:///file.db')
connection = engine.connect()
result = connection.execute(users_table.select())
for row in result:
# ....
connection.close()
明示的なコネクションレス実行、つまりEngine.execute()SQLテキストまたは構築されたSQL式を直接execute()Engine のメソッドに渡します。
engine = create_engine('sqlite:///file.db')
result = engine.execute(users_table.select())
for row in result:
# ....
result.close()
暗黙的な実行、つまりExecutable.execute()-もコネクションレスであり、のexecute()メソッドを呼び出します。つまり、式構成体(のインスタンス)自体で直接メソッドをExecutable呼び出します。execute()SQLExecutable
engine = create_engine('sqlite:///file.db')
meta.bind = engine
result = users_table.select().execute()
for row in result:
# ....
result.close()
注:明確化の目的で暗黙の実行例を示しました-この実行方法は強く推奨されていません- ドキュメントに従って:
「暗黙的実行」は非常に古い使用パターンであり、ほとんどの場合、役立つよりも混乱を招くため、その使用はお勧めしません。どちらのパターンも、後で問題につながるアプリケーション設計での便利な「ショートカット」の使いすぎを助長しているようです。
あなたの質問:
私が理解しているように、engine.executeを使用すると、接続が作成され、セッションが開かれ(Alchemyが処理します)、クエリを実行します。
あなたの部分のためにしている権利を「誰かの使用があればengine.execute、それは作成connectionではなく、」開くために「session(錬金術あなたのためにそれを気)と実行はクエリ」 -使用するEngine.execute()とConnection.execute()1つの同じこと(ほとんど)で、正式には、Connectionオブジェクトが暗黙的に作成されます、そして後のケースではそれを明示的にインスタンス化します。この場合に実際に何が起こるかは次のとおりです。
`Engine` object (instantiated via `create_engine()`) -> `Connection` object (instantiated via `engine_instance.connect()`) -> `connection.execute({*SQL expression*})`
しかし、そのようなタスクを実行するこれらの3つの方法には、世界的な違いがありますか?
DBレイヤーでもまったく同じです。それらはすべてSQL(テキスト式またはさまざまなSQL式構成)を実行しています。アプリケーションの観点から、2つのオプションがあります。
- 直接実行-
Engine.execute()またはの使用Connection.execute()
- 使用する
sessions-効率介して容易に、単一の作業単位としてトランザクションを処理しますsession.add()、session.rollback()、session.commit()、session.close()。これは、ORM、つまりマッピングされたテーブルの場合にDBと対話する方法です。単一のリクエスト中に、すでにアクセスされたオブジェクトまたは新しく作成/追加されたオブジェクトを即座に取得するためのidentity_mapを提供します。
Session.execute()最終的にはConnection.execute()、SQLステートメントを実行するためにステートメント実行メソッドを使用します。Sessionオブジェクトを使用することは、アプリケーションがデータベースと対話するためのSQLAlchemy ORMの推奨される方法です。
ドキュメントからの抜粋:
SQLAlchemy ORMを使用する場合、これらのオブジェクトは通常アクセスされないことに注意することが重要です。代わりに、Sessionオブジェクトがデータベースへのインターフェースとして使用されます。ただし、ORMの上位レベルの管理サービスの関与なしに、テキストSQLステートメントやSQL式構造体を直接使用するように構築されたアプリケーションの場合、エンジンと接続は王様(そして女王様?)です。