Como você executa SQL bruto no SQLAlchemy?
Eu tenho um aplicativo da web python que é executado no balão e faz interface com o banco de dados por meio do SQLAlchemy.
Eu preciso de uma maneira de executar o SQL bruto. A consulta envolve várias junções de tabela junto com exibições embutidas.
Eu tentei:
connection = db.session.connection()
connection.execute( <sql here> )
Mas continuo recebendo erros de gateway.
python
sql
sqlalchemy
flask
flask-sqlalchemy
starwing123
fonte
fonte
namedtuple
edict
diretamente: initd.org/psycopg/docs/extras.html .Respostas:
Você tentou:
ou:
fonte
BEGIN
eCOMMIT
.db.engine.execute(text("<sql here>")).execution_options(autocommit=True))
executa e confirma também.Os objetos de sessão do SQL Alchemy têm seu próprio
execute
método:Todas as suas consultas de aplicativos devem passar por um objeto de sessão, sejam eles SQL brutos ou não. Isso garante que as consultas sejam gerenciadas adequadamente por uma transação , o que permite que várias consultas na mesma solicitação sejam confirmadas ou revertidas como uma única unidade. Sair da transação usando o mecanismo ou a conexão oferece um risco muito maior de sutis, possivelmente difíceis de detectar bugs que podem deixar dados corrompidos. Cada solicitação deve ser associada a apenas uma transação e usar
db.session
garantirá que este é o caso do seu aplicativo.Observe também que
execute
foi projetado para consultas parametrizadas . Use parâmetros, como:val
no exemplo, para quaisquer entradas na consulta para se proteger de ataques de injeção de SQL. Você pode fornecer o valor para esses parâmetros passando umdict
como o segundo argumento, em que cada chave é o nome do parâmetro, conforme aparece na consulta. A sintaxe exata do próprio parâmetro pode ser diferente dependendo do seu banco de dados, mas todos os principais bancos de dados relacionais os suportam de alguma forma.Supondo que é um
SELECT
consulta, isso retornará uma iterável deRowProxy
objetos.Você pode acessar colunas individuais com uma variedade de técnicas:
Pessoalmente, prefiro converter os resultados em
namedtuple
s:Se você não estiver usando a extensão Flask-SQLAlchemy, ainda poderá usar facilmente uma sessão:
fonte
docs: Tutorial da linguagem de expressão SQL - Usando texto
exemplo:
fonte
==
?=
normalmente é reservado para atribuir um valor; enquanto que==
é reservado para comparar valoresVocê pode obter os resultados das consultas SELECT SQL usando
from_statement()
etext()
como mostrado aqui . Você não precisa lidar com tuplas dessa maneira. Como exemplo de uma classeUser
com o nome da tabela,users
você pode tentar,fonte
executa o,
<sql here>
mas não o confirma, a menos que você estejaautocommit
modo. Portanto, inserções e atualizações não refletiriam no banco de dados.Para confirmar após as alterações, faça
fonte
Primeiro, mapeie seu módulo (se seu módulo / aplicativo estiver manage.py na pasta principal e você estiver em um sistema operacional UNIX), execute:
Executar shell do balão
Importe o que precisamos:
Execute sua consulta:
Isso usa a conexão de banco de dados atualmente que possui o aplicativo.
fonte
Você já tentou usar
connection.execute(text( <sql here> ), <bind params here> )
e vincular parâmetros, conforme descrito nos documentos ? Isso pode ajudar a resolver muitos problemas de formatação e desempenho de parâmetros. Talvez o erro do gateway seja um tempo limite? Os parâmetros de ligação tendem a fazer consultas complexas serem executadas substancialmente mais rapidamente.fonte
connection.execute(text(<sql here>), <bind params> )
.bind params
não deve estar emtext()
. alimentando nos parâmetros de ligação para o método de execução ()Se você deseja evitar tuplas, outra maneira é chamar os métodos
first
,one
ouall
:fonte