Os objetos de sessão do SQL Alchemy têm seu próprio execute
método:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
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 usardb.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:
for r in result:
print(r[0]) # Access by positional index
print(r['my_column']) # Access by column name as a string
r_dict = dict(r.items()) # convert to dict keyed by column names
Pessoalmente, prefiro converter os resultados em namedtuple
s:
from collections import namedtuple
Record = namedtuple('Record', result.keys())
records = [Record(*r) for r in result.fetchall()]
for r in records:
print(r.my_column)
print(r)
Se você não estiver usando a extensão Flask-SQLAlchemy, ainda poderá usar facilmente uma sessão:
import sqlalchemy
from sqlalchemy.orm import sessionmaker, scoped_session
engine = sqlalchemy.create_engine('my connection string')
Session = scoped_session(sessionmaker(bind=engine))
s = Session()
result = s.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})