Maison > développement back-end > Tutoriel Python > 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
Libérer: 2024-10-18 13:29:03
original
394 Les gens l'ont consulté

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))
Copier après la connexion

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))
Copier après la connexion

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()))
Copier après la connexion

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}))
Copier après la connexion

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})"
Copier après la connexion

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}))
Copier après la connexion

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

SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal