Nella stragrande maggioranza dei casi, la "stringa" di un'istruzione o una query SQLAlchemy è semplice come:
print str(statement)
Questo vale sia per un ORM Query
che per qualsiasi select()
altra istruzione.
Nota : la seguente risposta dettagliata viene mantenuta nella documentazione di sqlalchemy .
Per ottenere l'istruzione come compilata per un dialetto o un motore specifico, se l'istruzione stessa non è già associata a una, è possibile passarla a compile () :
print statement.compile(someengine)
o senza motore:
from sqlalchemy.dialects import postgresql
print statement.compile(dialect=postgresql.dialect())
Quando viene assegnato un Query
oggetto ORM , per ottenere il compile()
metodo è necessario prima accedere solo all'accessorio .statement :
statement = query.statement
print statement.compile(someengine)
per quanto riguarda la clausola originale secondo cui i parametri associati devono essere "incorporati" nella stringa finale, la sfida qui è che SQLAlchemy normalmente non ha questo compito, poiché questo è gestito in modo appropriato da Python DBAPI, per non parlare del bypassare i parametri associati è probabilmente le falle di sicurezza più ampiamente sfruttate nelle moderne applicazioni web. SQLAlchemy ha una capacità limitata di eseguire questa stringa in determinate circostanze come quella dell'emissione DDL. Per accedere a questa funzionalità è possibile utilizzare il flag 'literal_binds', passato a 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})
l'approccio sopra ha le avvertenze che è supportato solo per tipi di base, come ints e stringhe, e inoltre se un valore bindparam
senza un valore preimpostato viene utilizzato direttamente, non sarà in grado di precisare neanche quello.
Per supportare il rendering letterale inline per tipi non supportati, implementare a TypeDecorator
per il tipo di destinazione che include un
TypeDecorator.process_literal_param
metodo:
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})
)
produrre output come:
SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)
sqlalchemy.engine
registro di SQLAlchemy . Registra query e parametri di bind, dovresti solo sostituire i segnaposto di bind con i valori su una stringa di query SQL facilmente costruita.