J'essaie de trouver le meilleur moyen de formater une chaîne de requête SQL. Lorsque je débogue mon application, j'aimerais me connecter pour classer toutes les chaînes de requête SQL, et il est important que la chaîne soit correctement formatée.
Option 1
def myquery():
sql = "select field1, field2, field3, field4 from table where condition1=1 and condition2=2"
con = mymodule.get_connection()
...
- C'est bon pour imprimer la chaîne sql.
- Ce n'est pas une bonne solution si la chaîne est longue et ne correspond pas à la largeur standard de 80 caractères.
Option 2
def query():
sql = """
select field1, field2, field3, field4
from table
where condition1=1
and condition2=2"""
con = mymodule.get_connection()
...
Ici, le code est clair, mais lorsque vous imprimez la chaîne de requête SQL, vous obtenez tous ces espaces blancs ennuyeux.
u '\ nsélectionnez champ1, champ2, champ3, champ4 \ n_ _ ___ de la table \ n _ ___ où condition1 = 1 \ n _ ___ _et condition2 = 2'
Remarque: j'ai remplacé les espaces blancs par des traits de soulignement _
, car ils sont coupés par l'éditeur
Option 3
def query():
sql = """select field1, field2, field3, field4
from table
where condition1=1
and condition2=2"""
con = mymodule.get_connection()
...
- Je n'aime pas cette option car elle brise la clarté du code bien tabulé.
Option 4
def query():
sql = "select field1, field2, field3, field4 " \
"from table " \
"where condition1=1 " \
"and condition2=2 "
con = mymodule.get_connection()
...
- Je n'aime pas cette option car toute la saisie supplémentaire dans chaque ligne et il est également difficile de modifier la requête.
Pour moi, la meilleure solution serait l' option 2 mais je n'aime pas les espaces supplémentaires lorsque j'imprime la chaîne sql.
Connaissez-vous d'autres options?
la source
Réponses:
Désolé d'avoir posté sur un fil aussi ancien - mais en tant que personne partageant également une passion pour le «meilleur» pythonique, j'ai pensé partager notre solution.
La solution consiste à créer des instructions SQL en utilisant la concaténation littérale de chaîne de python ( http://docs.python.org/ ), qui pourrait être qualifiée quelque part entre les options 2 et 4.
Exemple de code:
Fonctionne également avec les chaînes F :
Avantages:
la source
"""
et de l'utilisertextwrap.dedent()
avant la sortie"sql query"
pour éviter de jouer avec les chaînes SQL (qui utilisent des guillemets simples en standard)?Vous avez évidemment envisagé de nombreuses façons d'écrire le SQL de manière à ce qu'il s'imprime correctement, mais que diriez-vous de changer l'instruction 'print' que vous utilisez pour la journalisation du débogage, plutôt que d'écrire votre SQL d'une manière que vous n'aimez pas? En utilisant votre option préférée ci-dessus, que diriez-vous d'une fonction de journalisation comme celle-ci:
Cela rendrait également trivial d'ajouter une logique supplémentaire pour diviser la chaîne journalisée sur plusieurs lignes si la ligne est plus longue que la longueur souhaitée.
la source
La manière la plus propre que j'ai rencontrée est inspirée du guide de style SQL .
Essentiellement, les mots-clés qui commencent une clause doivent être alignés à droite et les noms de champs, etc., doivent être alignés à gauche. Cela semble très soigné et est également plus facile à déboguer.
la source
si la valeur de condition doit être une chaîne, vous pouvez faire comme ceci:
la source
format()
des chaînes SQL, c'est une odeur de code majeure.where condition1=:field1
puis la transmission des valeurs en tant que paramètres. Si vous utilisez.format()
, il y aura un moyen d'insérer un';DROP TABLE Users
dans votre SQL. Jetez un œil à PEP-249 pour savoir comment utiliser correctement les paramètres. python.org/dev/peps/pep-0249/#paramstylePour éviter complètement le formatage , je pense qu'une excellente solution est d'utiliser des procédures .
L'appel d'une procédure vous donne le résultat de la requête que vous souhaitez mettre dans cette procédure. Vous pouvez en fait traiter plusieurs requêtes dans une procédure. L'appel renverra simplement la dernière requête qui a été appelée.
MYSQL
Python
la source
vous pouvez mettre les noms de champs dans un tableau "fields", puis:
la source
Je suggérerais de m'en tenir à l'option 2 (je l'utilise toujours pour les requêtes plus complexes que
SELECT * FROM table
) et si vous souhaitez l'imprimer de manière agréable, vous pouvez toujours utiliser un module séparé .la source
Pour les requêtes courtes qui peuvent tenir sur une ou deux lignes, j'utilise la solution littérale de chaîne dans la solution la plus votée ci-dessus. Pour les requêtes plus longues, je les divise en
.sql
fichiers. J'utilise ensuite une fonction wrapper pour charger le fichier et exécuter le script, quelque chose comme:Bien sûr, cela vit souvent dans une classe, donc je n'ai généralement pas à passer
cursor
explicitement. J'utilise aussi généralementcodecs.open()
, mais cela fait passer l'idée générale. Ensuite, les scripts SQL sont complètement autonomes dans leurs propres fichiers avec leur propre coloration syntaxique.la source
[edit in responese to comment]
Avoir une chaîne SQL dans une méthode ne signifie PAS que vous devez la «tabuler»:
la source
select
. Ma réponse n'a pas d'espaces de premier plan. Qu'est-ce qui vous a amené à penser qu'ils sont identiques?