Puedo utilizar SQLAlchemy y hay al menos tres entidades: engine
, session
y connection
, que tiene execute
método, por lo que si por ejemplo, deseo seleccionar todos los registros de table
lo que puedo hacer esto
engine.execute(select([table])).fetchall()
y esto
connection.execute(select([table])).fetchall()
e incluso esto
session.execute(select([table])).fetchall()
- Los resultados serán los mismos.
Según tengo entendido, si alguien lo usa engine.execute
crea connection
, abre session
(Alchemy se encarga de usted) y ejecuta la consulta. Pero, ¿existe una diferencia global entre estas tres formas de realizar una tarea así?
Respuestas:
Una descripción general de una línea:
El comportamiento de
execute()
es igual en todos los casos, pero son 3 métodos diferentes, enEngine
,Connection
ySession
clases.Qué es exactamente
execute()
:Para comprender el comportamiento de,
execute()
debemos mirar dentro de laExecutable
clase.Executable
es una superclase para todos los tipos de objetos "enunciados", incluidos select (), delete (), update (), insert (), text (); en palabras más simples posibles,Executable
es una construcción de expresión SQL compatible con SQLAlchemy.En todos los casos, el
execute()
método toma el texto SQL o la expresión SQL construida, es decir, cualquiera de la variedad de construcciones de expresiones SQL compatibles con SQLAlchemy y devuelve los resultados de la consulta (aResultProxy
- Envuelve unDB-API
objeto cursor para proporcionar un acceso más fácil a las columnas de fila).Para aclararlo más (solo para aclaración conceptual, no es un enfoque recomendado) :
Además de
Engine.execute()
(ejecución sin conexión),Connection.execute()
ySession.execute()
, también es posible usarexecute()
directamente en cualquierExecutable
construcción. LaExecutable
clase tiene su propia implementación deexecute()
: Según la documentación oficial, una descripción de una línea sobre lo queexecute()
hace es " Compilar y ejecutar estoExecutable
". En este caso, necesitamos vincular explícitamente laExecutable
(construcción de expresión SQL) con unConnection
objeto o,Engine
objeto (que implícitamente obtiene unConnection
objeto), paraexecute()
que sepan dónde ejecutar elSQL
.El siguiente ejemplo lo demuestra bien: dada una tabla como la siguiente:
Ejecución explícita, es decir
Connection.execute()
, pasar el texto SQL o la expresión SQL construida alexecute()
método deConnection
:Ejecución explícita sin conexión, es decir
Engine.execute()
, pasar el texto SQL o la expresión SQL construida directamente alexecute()
método de Engine:La ejecución implícita, es decir
Executable.execute()
, también no tiene conexión y llama alexecute()
método deExecutable
, es decir, llama alexecute()
método directamente en elSQL
constructo de expresión (una instancia deExecutable
) en sí mismo.Nota: Expresé el ejemplo de ejecución implícita con el propósito de aclarar, esta forma de ejecución no es muy recomendable, según los documentos :
Tus preguntas:
Tienes razón para la parte "si alguien lo usa
engine.execute
creaconnection
" pero no para "abresession
(Alchemy se preocupa por ti) y ejecuta la consulta" - UsandoEngine.execute()
yConnection.execute()
es (casi) una misma cosa, formalmente, elConnection
objeto se crea implícitamente , y en un caso posterior lo instanciamos explícitamente. Lo que realmente sucede en este caso es:En la capa DB es exactamente lo mismo, todos ellos están ejecutando SQL (expresiones de texto o varias construcciones de expresiones SQL). Desde el punto de vista de la aplicación, hay dos opciones:
Engine.execute()
oConnection.execute()
sessions
- gestiona de manera eficaz transacción como una sola unidad de trabajo, con facilidad a través desession.add()
,session.rollback()
,session.commit()
,session.close()
. Es la forma de interactuar con la base de datos en el caso de ORM, es decir, tablas mapeadas. Proporciona identity_map para obtener instantáneamente objetos ya accedidos o recién creados / agregados durante una sola solicitud.Session.execute()
en última instancia, utiliza elConnection.execute()
método de ejecución de sentencias para ejecutar la sentencia SQL El uso deSession
objetos es la forma recomendada de SQLAlchemy ORM para que una aplicación interactúe con la base de datos.Un extracto de los documentos :
fuente
La respuesta de Nabeel cubre muchos detalles y es útil, pero me pareció confuso seguirla. Dado que este es actualmente el primer resultado de Google para este problema, agrego mi comprensión para futuras personas que encuentren esta pregunta:
Ejecutando .execute ()
Como OP y Nabell Ahmed notan, cuando se ejecuta un plano
SELECT * FROM tablename
, no hay diferencia en el resultado proporcionado.Las diferencias entre estos tres objetos no llegan a ser importantes en función del contexto que la
SELECT
instrucción se utiliza en o, más comúnmente, cuando se quiere hacer otras cosas comoINSERT
,DELETE
, etc.Cuándo usar Engine, Connection, Session en general
El motor es el objeto de nivel más bajo utilizado por SQLAlchemy. Se mantiene un grupo de conexiones disponibles para su uso siempre que la aplicación necesita hablar con la base de datos.
.execute()
es un método de conveniencia que primero llamaconn = engine.connect(close_with_result=True)
y luegoconn.execute()
. El parámetro close_with_result significa que la conexión se cierra automáticamente. (Estoy parafraseando ligeramente el código fuente, pero esencialmente cierto). editar: Aquí está el código fuente de engine.executePuede usar el motor para ejecutar SQL sin formato.
Esto está cubierto en los documentos de uso básico .
La conexión es (como vimos anteriormente) lo que realmente hace el trabajo de ejecutar una consulta SQL. Debe hacer esto siempre que desee un mayor control sobre los atributos de la conexión, cuando se cierra, etc. Por ejemplo, un ejemplo muy importante de esto es una Transacción , que le permite decidir cuándo confirmar sus cambios en la base de datos. En uso normal, los cambios se confirman automáticamente. Con el uso de transacciones, podría (por ejemplo) ejecutar varias declaraciones SQL diferentes y si algo sale mal con una de ellas, podría deshacer todos los cambios a la vez.
Esto le permitirá deshacer ambos cambios si falla uno, como si olvidara crear la tabla de registro de datos.
Entonces, si está ejecutando código SQL sin procesar y necesita control, use conexiones
Las sesiones se usan para el aspecto de Gestión de relaciones de objeto (ORM) de SQLAlchemy (de hecho, puede ver esto por cómo se importan:)
from sqlalchemy.orm import sessionmaker
. Usan conexiones y transacciones bajo el capó para ejecutar sus declaraciones SQL generadas automáticamente..execute()
es una función de conveniencia que pasa a lo que sea que esté vinculada la sesión (generalmente un motor, pero puede ser una conexión).Si está utilizando la funcionalidad ORM, use session; Si solo está haciendo consultas SQL directas no vinculadas a objetos, probablemente sea mejor que use conexiones directamente.
fuente
""
?my_session.connection()
. Documentos: docs.sqlalchemy.org/en/13/orm/… .Aquí hay un ejemplo de ejecución de DCL (lenguaje de control de datos) como GRANT
fuente