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!