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 Queryet à 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 Queryobjet 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 TypeDecoratorpour le type cible qui inclut une
TypeDecorator.process_literal_parammé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.enginejournal 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.