SQLAlchemy : dévoiler la véritable requête
Lorsque vous travaillez avec SQLAlchemy, il peut être utile d'inspecter les requêtes SQL réelles en cours d'exécution. Bien que SQLAlchemy s'appuie généralement sur des paramètres de liaison, il existe des moyens de générer les instructions SQL correspondantes, y compris les valeurs réelles.
Solution générale
Dans la plupart des cas, vous pouvez facilement obtenez la représentation sous forme de chaîne SQL d'une instruction ou d'une requête SQLAlchemy :
<code class="python">import sqlalchemy as sa print(str(statement))</code>
Cela fonctionne à la fois pour les requêtes ORM et select() ou d'autres instructions. Si nécessaire, vous pouvez compiler l'instruction dans un dialecte ou un moteur spécifique :
<code class="python">print(statement.compile(someengine))</code>
ou sans spécifier de moteur :
<code class="python">from sqlalchemy.dialects import postgresql print(statement.compile(dialect=postgresql.dialect()))</code>
Inlining Bound Parameters
Pour inclure les valeurs réelles au lieu des paramètres de liaison dans la chaîne SQL, SQLAlchemy fournit une prise en charge limitée via l'indicateur 'literal_binds' dans compile_kwargs :
<code class="python">from sqlalchemy import table, column, select t = table('t', column('x')) s = select([t]).where(t.c.x == 5) print(s.compile(compile_kwargs={"literal_binds": True}))</code>
Cependant, cette approche ne fonctionne que pour les types de base et ne peut pas gérer les paramètres de liaison sans valeurs pré-attribuées. Pour les types personnalisés, vous pouvez implémenter un TypeDecorator avec une méthode process_literal_param :
<code class="python">class MyFancyType(TypeDecorator): def process_literal_param(self, value, dialect): return "my_fancy_formatting(%s)" % value</code>
Cela vous permet de personnaliser le rendu des valeurs en fonction de vos besoins spécifiques.
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!