한 줄 개요 :
의 동작은 execute()
모든 경우에 동일하지만, 그들은 3 개 가지 방법에 Engine
, Connection
그리고 Session
클래스.
정확히 무엇입니까 execute()
:
execute()
우리의 행동을 이해하려면 Executable
수업 을 살펴 봐야합니다 . Executable
select (), delete (), update (), insert (), text ()를 포함한 모든 "statement"유형의 객체에 대한 수퍼 클래스입니다. 가능한 가장 간단한 단어로, Executable
SQLAlchemy에서 지원되는 SQL 식 구문입니다.
모든 경우에이 execute()
메소드는 SQL 텍스트 또는 생성 된 SQL 표현식, 즉 SQLAlchemy에서 지원되는 다양한 SQL 표현식 구성 중 하나를 취하여 쿼리 결과를 리턴합니다 ( ResultProxy
a- DB-API
행 오브젝트에 쉽게 액세스 할 수 있도록 커서 오브젝트 랩핑 ).
더 명확하게하기 위해 (개념적 설명만을 위해 권장되는 접근법은 아님) :
Engine.execute()
(연결없는 실행) 외에도 Connection.execute()
, 및 모든 구문 Session.execute()
에서 execute()
직접 사용할 수도 있습니다 Executable
. 이 Executable
클래스에는 자체 구현이 있습니다. execute()
공식 문서에 따라 수행 한 작업에 대한 한 줄 설명 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()
SQL
Executable
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()
(거의) 하나 같은 일이 공식에서, Connection
오브젝트가 내재적으로 작성됩니다 나중에는 명시 적으로 인스턴스화합니다. 이 경우 실제로 일어나는 일은 다음과 같습니다.
`Engine` object (instantiated via `create_engine()`) -> `Connection` object (instantiated via `engine_instance.connect()`) -> `connection.execute({*SQL expression*})`
그러나 이러한 작업을 수행하는 세 가지 방법 간에는 전 세계적으로 다른 점이 있습니까?
DB 계층에서 정확히 같은 것입니다. 모두 SQL (텍스트 표현식 또는 다양한 SQL 표현식 구성)을 실행하고 있습니다. 응용 프로그램의 관점에서 두 가지 옵션이 있습니다.
- 직접 실행-
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 표현식 구성을 직접 사용하도록 빌드 된 응용 프로그램의 경우 엔진 및 연결이 왕성한 (그리고 여왕입니까?)입니다.