Maison >développement back-end >Tutoriel Python >Comment obtenir la requête SQL réelle exécutée dans SQLAlchemy ?

Comment obtenir la requête SQL réelle exécutée dans SQLAlchemy ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-18 13:15:031117parcourir

How to Obtain the Actual SQL Query Executed in SQLAlchemy?

Impression de requêtes SQL réelles dans SQLAlchemy

L'exécution de requêtes SQL dans SQLAlchemy implique la liaison de paramètres pour empêcher les attaques par injection SQL. Cependant, obtenir la requête SQL réelle, y compris les valeurs, peut être difficile.

Solution générale

La méthode la plus simple pour récupérer la requête SQL sous forme de chaîne consiste à utiliser la fonction str() :

<code class="python">print(str(statement))  # for both ORM Query and SQL statements</code>

Implémentation des paramètres liés

Par défaut, SQLAlchemy lie les paramètres pour des raisons de sécurité. Vous pouvez supprimer ce comportement à l'aide de l'indicateur literal_binds dans compile_kwargs :

<code class="python">from sqlalchemy.dialects import postgresql

print(
    statement.compile(compile_kwargs={"literal_binds": True})
)</code>

Notez que la liaison littérale n'est prise en charge que pour les types de base tels que les entiers et les chaînes.

Personnalisation de la conversion des paramètres

Si vous devez convertir des types plus complexes, vous pouvez créer un TypeDecorator personnalisé avec une méthode process_literal_param :

<code class="python">class MyFancyType(TypeDecorator):
    impl = Integer

    def process_literal_param(self, value, dialect):
        return "my_fancy_formatting(%s)" % value

print(
    tab.select().where(tab.c.x > 5).compile(
        compile_kwargs={"literal_binds": True})
)</code>

Cela produira une requête comme :

<code class="sql">SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn