Maison  >  Article  >  développement back-end  >  Comment imprimer des requêtes SQL réelles avec des valeurs pendant le débogage dans SQLAlchemy ?

Comment imprimer des requêtes SQL réelles avec des valeurs pendant le débogage dans SQLAlchemy ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-18 13:29:03272parcourir

How to Print Actual SQL Queries with Values During Debugging in SQLAlchemy?

Débogage des requêtes SQLAlchemy : impression du SQL réel avec des valeurs

Lors du débogage des expressions SQLAlchemy, il est utile de voir la requête SQL réelle en cours d'exécution, y compris les valeurs spécifiques au lieu des paramètres de liaison . Bien que SQLAlchemy ne fournisse pas de méthode explicite pour cela, il existe plusieurs façons d'y parvenir.

Approche générale

Dans la plupart des cas, vous pouvez simplement appeler str() sur l'instruction SQLAlchemy. ou requête :

print(str(statement))

Cela fonctionne à la fois pour les requêtes ORM (objets de requête) et les instructions SQL pures (select(), etc.).

Compilation spécifique au moteur

Si vous avez besoin d'une instruction compilée pour un moteur de base de données spécifique, vous pouvez utiliser la méthode compile() :

print(statement.compile(some_engine))

Ou, si vous n'avez pas de moteur, vous pouvez spécifier un dialecte :

from sqlalchemy.dialects import postgresql
print(statement.compile(dialect=postgresql.dialect()))

Inline Bound Parameters

Dans certaines circonstances, vous souhaiterez peut-être intégrer des paramètres liés dans la chaîne SQL finale. Ceci peut être réalisé en utilisant l'indicateur literal_binds :

print(statement.compile(compile_kwargs={"literal_binds": True}))

Notez que ceci n'est pris en charge que pour les types de base tels que les entiers et les chaînes. Pour les types plus complexes, vous devrez peut-être créer un décorateur de type personnalisé.

Décorateurs de type personnalisés

Pour prendre en charge le rendu en ligne de types non pris en charge, vous pouvez créer un décorateur de type personnalisé avec une méthode process_literal_param :

class MyFancyType(TypeDecorator):
    ...
    def process_literal_param(self, value, dialect):
        return f"my_fancy_formatting({value})"

Avec ce décorateur, vous pouvez intégrer des valeurs complexes :

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

générant un résultat tel que :

SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)

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