W większości przypadków „stringification” instrukcji lub zapytania SQLAlchemy jest tak proste, jak:
print str(statement)
Dotyczy to zarówno ORM, Query
jak i każdego select()
innego oświadczenia.
Uwaga : następująca szczegółowa odpowiedź jest przechowywana w dokumentacji sqlalchemy .
Aby otrzymać instrukcję skompilowaną do określonego dialektu lub silnika, jeśli sama instrukcja nie jest już powiązana z żadnym, możesz przekazać ją do metody compile () :
print statement.compile(someengine)
lub bez silnika:
from sqlalchemy.dialects import postgresql
print statement.compile(dialect=postgresql.dialect())
Gdy otrzymamy Query
obiekt ORM , aby uzyskać dostęp do compile()
metody, musimy najpierw uzyskać dostęp do metody dostępu .statement :
statement = query.statement
print statement.compile(someengine)
jeśli chodzi o pierwotne zastrzeżenie, że powiązane parametry mają być „wstawiane” do końcowego ciągu, wyzwaniem jest tutaj to, że SQLAlchemy normalnie nie ma tego zadania, ponieważ jest to odpowiednio obsługiwane przez Python DBAPI, nie wspominając o pomijaniu powiązanych parametrów jest prawdopodobnie najczęściej wykorzystywane luki bezpieczeństwa w nowoczesnych aplikacjach internetowych. SQLAlchemy ma ograniczone możliwości wykonywania tego ciągu w pewnych okolicznościach, takich jak emisja DDL. Aby uzyskać dostęp do tej funkcjonalności, można użyć flagi „literal_binds” przekazanej do compile_kwargs
:
from sqlalchemy.sql import table, column, select
t = table('t', column('x'))
s = select([t]).where(t.c.x == 5)
print s.compile(compile_kwargs={"literal_binds": True})
powyższe podejście ma zastrzeżenia, że jest obsługiwane tylko dla podstawowych typów, takich jak ints i stringi, a ponadto, jeśli a bindparam
bez wstępnie ustawionej wartości jest używane bezpośrednio, nie będzie w stanie tego również określić.
Aby obsługiwać renderowanie literału wbudowanego dla typów nieobsługiwanych, zaimplementuj a TypeDecorator
dla typu docelowego, który zawiera
TypeDecorator.process_literal_param
metodę:
from sqlalchemy import TypeDecorator, Integer
class MyFancyType(TypeDecorator):
impl = Integer
def process_literal_param(self, value, dialect):
return "my_fancy_formatting(%s)" % value
from sqlalchemy import Table, Column, MetaData
tab = Table('mytable', MetaData(), Column('x', MyFancyType()))
print(
tab.select().where(tab.c.x > 5).compile(
compile_kwargs={"literal_binds": True})
)
wytwarzanie wyników takich jak:
SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)
sqlalchemy.engine
dziennika SQLAlchemy . Rejestruje zapytania i parametry wiązania, wystarczy zamienić symbole zastępcze powiązań na wartości z łatwo skonstruowanego ciągu zapytania SQL.