Eu uso SQLAlchemy e há pelo menos três entidades: engine
, session
e connection
, que tem execute
método, por isso, se eu por exemplo, quer selecionar todos os registros de table
que posso fazer isso
engine.execute(select([table])).fetchall()
e isto
connection.execute(select([table])).fetchall()
e até isso
session.execute(select([table])).fetchall()
- os resultados serão os mesmos.
Pelo que entendi, se alguém usa, engine.execute
ele cria connection
, abre session
(a Alquimia cuida disso para você) e executa a consulta. Mas existe uma diferença global entre essas três maneiras de executar essa tarefa?
Respostas:
Uma visão geral de uma linha:
O comportamento do
execute()
é o mesmo em todos os casos, mas eles são 3 métodos diferentes, emEngine
,Connection
eSession
classes.O que exatamente é
execute()
:Para entender o comportamento
execute()
, precisamos olhar para aExecutable
classe.Executable
é uma superclasse para todos os tipos de objetos "instrução", incluindo selecionar (), excluir (), atualizar (), inserir (), texto () - nas palavras mais simples possíveis, umExecutable
é um construto de expressão SQL suportado no SQLAlchemy.Em todos os casos, o
execute()
método utiliza o texto SQL ou a expressão SQL construída, ou seja, qualquer uma das várias construções de expressão SQL suportadas no SQLAlchemy e retorna os resultados da consulta (aResultProxy
- Envolve umDB-API
objeto cursor para fornecer acesso mais fácil às colunas da linha.)Para esclarecer melhor (apenas para esclarecimentos conceituais, não uma abordagem recomendada) :
Além de
Engine.execute()
(execução sem conexão),,Connection.execute()
eSession.execute()
, também é possível usar oexecute()
diretamente em qualquerExecutable
construção. AExecutable
classe possui sua própria implementaçãoexecute()
- Conforme a documentação oficial, uma descrição de linha sobre o queexecute()
faz é " Compilar e executar issoExecutable
". Nesse caso, precisamos vincular explicitamente oExecutable
(construto de expressão SQL) a umConnection
objeto ou,Engine
objeto (que obtém implicitamente umConnection
objeto), para queexecute()
você saiba onde executar oSQL
.O exemplo a seguir demonstra bem isso - Dada uma tabela como abaixo:
Execução explícita, ou seja
Connection.execute()
- passar o texto SQL ou a expressão SQL construída para oexecute()
método deConnection
:Execução explícita sem conexão, isto é
Engine.execute()
- passando o texto SQL ou a expressão SQL construída diretamente para oexecute()
método do Engine:A execução implícita, ie
Executable.execute()
-, também é sem conexão e chama oexecute()
método doExecutable
, isto é, chama oexecute()
método diretamente naSQL
construção da expressão (uma instância deExecutable
) em si.Nota: Indique o exemplo implícito de execução para fins de esclarecimento - este modo de execução não é altamente recomendado - conforme os documentos :
Suas perguntas:
Você está certo quanto à parte "se alguém usá-
engine.execute
lo criaconnection
", mas não para "abresession
(a Alquimia se preocupa com você) e executa a consulta" - UsandoEngine.execute()
eConnection.execute()
é (quase) a mesma coisa, formal, oConnection
objeto é criado implicitamente e, posteriormente, instanciamos explicitamente. O que realmente acontece neste caso é:Na camada DB, é exatamente a mesma coisa, todos eles estão executando SQL (expressão de texto ou várias construções de expressão SQL). Do ponto de vista do aplicativo, existem duas opções:
Engine.execute()
ouConnection.execute()
sessions
- eficiente lida transação como única unidade-de-obra, com facilidade viasession.add()
,session.rollback()
,session.commit()
,session.close()
. É a maneira de interagir com o banco de dados no caso de ORM, ou seja, tabelas mapeadas. Fornece identity_map para obter instantaneamente objetos já acessados ou recém-criados / adicionados durante uma única solicitação.Session.execute()
em última análise, usa oConnection.execute()
método de execução de instrução para executar a instrução SQL. UsarSession
objeto é a maneira recomendada do SQLAlchemy ORM para um aplicativo interagir com o banco de dados.Um trecho dos documentos :
fonte
A resposta de Nabeel cobre muitos detalhes e é útil, mas achei confuso seguir. Como atualmente este é o primeiro resultado do Google para esse problema, adiciono meu entendimento a pessoas futuras que encontrarem essa pergunta:
Executando .execute ()
Como OP e Nabell Ahmed observam, ao executar uma planície
SELECT * FROM tablename
, não há diferença no resultado fornecido.As diferenças entre estes três objetos se tornam importantes, dependendo do contexto que a
SELECT
declaração é usada em ou, mais comumente, quando você quer fazer outras coisas comoINSERT
,DELETE
, etc.Quando usar o Mecanismo, Conexão, Sessão geralmente
O mecanismo é o objeto de nível mais baixo usado pelo SQLAlchemy. Ele mantém um conjunto de conexões disponíveis para uso sempre que o aplicativo precisar conversar com o banco de dados.
.execute()
é um método de conveniência que primeiro chamaconn = engine.connect(close_with_result=True)
e depoisconn.execute()
. O parâmetro close_with_result significa que a conexão é fechada automaticamente. (Estou parafraseando um pouco o código fonte, mas essencialmente verdadeiro). edit: Aqui está o código fonte do engine.executeVocê pode usar o mecanismo para executar o SQL bruto.
Isso é abordado nos documentos em uso básico .
A conexão é (como vimos acima) a coisa que realmente faz o trabalho de executar uma consulta SQL. Você deve fazer isso sempre que quiser maior controle sobre os atributos da conexão, quando ela for fechada, etc. Por exemplo, um exemplo muito importante disso é uma transação , que permite decidir quando confirmar suas alterações no banco de dados. No uso normal, as alterações são confirmadas automaticamente. Com o uso de transações, você pode (por exemplo) executar várias instruções SQL diferentes e, se algo der errado com uma delas, poderá desfazer todas as alterações de uma só vez.
Isso permitiria desfazer as duas alterações se uma falhasse, como se você se esquecesse de criar a tabela de registro de dados.
Portanto, se você estiver executando código SQL bruto e precisar de controle, use conexões
As sessões são usadas para o aspecto ORM (Object Relationship Management) de SQLAlchemy (na verdade, você pode ver isso de como são importadas:)
from sqlalchemy.orm import sessionmaker
. Eles usam conexões e transações ocultas para executar suas instruções SQL geradas automaticamente..execute()
é uma função de conveniência que passa para o que a sessão está vinculada (geralmente um mecanismo, mas pode ser uma conexão).Se você estiver usando a funcionalidade ORM, use session; se você estiver fazendo apenas consultas SQL diretas e não vinculadas a objetos, provavelmente será melhor usar conexões diretamente.
fonte
""
?my_session.connection()
. Documentos: docs.sqlalchemy.org/en/13/orm/… .Aqui está um exemplo de execução de DCL (Data Control Language) como GRANT
fonte