Dans la grande majorité des cas, la "stringification" d'une instruction ou d'une requête SQLAlchemy est aussi simple que:
print str(statement)
Cela s'applique à la fois à un ORM Query
et à toute select()
instruction ou autre.
Remarque : la réponse détaillée suivante est maintenue dans la documentation de sqlalchemy .
Pour obtenir l'instruction compilée dans un dialecte ou un moteur spécifique, si l'instruction elle-même n'est pas déjà liée à un, vous pouvez la transmettre à compile () :
print statement.compile(someengine)
ou sans moteur:
from sqlalchemy.dialects import postgresql
print statement.compile(dialect=postgresql.dialect())
Lorsqu'on lui donne un Query
objet ORM , pour accéder à la compile()
méthode, il suffit d'accéder d' abord à l' accesseur .statement :
statement = query.statement
print statement.compile(someengine)
en ce qui concerne la stipulation d'origine selon laquelle les paramètres liés doivent être "intégrés" dans la chaîne finale, le défi ici est que SQLAlchemy n'est normalement pas chargé de cela, car cela est géré de manière appropriée par le Python DBAPI, sans parler du contournement des paramètres liés. probablement les failles de sécurité les plus largement exploitées dans les applications Web modernes. SQLAlchemy a une capacité limitée à effectuer cette stringification dans certaines circonstances telles que l'émission de DDL. Pour accéder à cette fonctionnalité, on peut utiliser le drapeau 'literal_binds', passé à 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'approche ci-dessus a la mise en garde qu'elle n'est prise en charge que pour les types de base, tels que les ints et les chaînes, et de plus si un bindparam
sans valeur prédéfinie est utilisé directement, il ne pourra pas non plus le stringify.
Pour prendre en charge le rendu littéral en ligne pour les types non pris en charge, implémentez un TypeDecorator
pour le type cible qui inclut une
TypeDecorator.process_literal_param
méthode:
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})
)
produisant une sortie comme:
SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)
sqlalchemy.engine
journal de SQLAlchemy . Il enregistre les requêtes et les paramètres de liaison, il vous suffit de remplacer les espaces réservés de liaison par les valeurs d'une chaîne de requête SQL facilement construite.