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.
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.).
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()))
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é.
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!