141 votes

Python requête SQL de mise en forme de chaîne

J'essaie de trouver la meilleure façon de formater une chaîne de requête sql. Quand je suis débogage mon application j'aimerais log dans un fichier toutes les chaînes de requête sql, et il est important que la chaîne est correctement formaté.

Option 1

def myquery():
    sql = "select field1, field2, field3, field4 from table where condition1=1 and condition2=2"
    con = mymodule.get_connection()
    ...
  • Ce qui est bon pour l'impression de la chaîne sql.
  • Ce n'est pas une bonne solution si la chaîne est longue et ne s'adapte à 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 quand vous imprimez la chaîne de requête sql que vous obtenez tous ces ennuyeux des espaces blancs.

    u'\nchoisir champ1, champ2, champ3, field4\n_____à partir du tableau\n____où condition1=1 \n_____and condition2=2'

Note: j'ai remplacé les espaces blanc avec trait de soulignement _,, car ils sont garnis 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 se casse la clarté du bien compilé le code.

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 tout le taper dans chaque ligne et il est difficile de modifier la requête, aussi.

Pour moi, la meilleure solution serait l'Option 2 , mais je n'aime pas les extra espaces lorsque j'imprime la chaîne sql.

Connaissez-vous d'autres options?

191voto

user590028 Points 2709

Désolé pour l'affichage de tel un vieux thread mais comme quelqu'un qui a aussi le partage d'une passion pour pythonic "meilleur", j'ai pensé partager notre solution.

La solution est de construire des instructions SQL à l'aide de python est un Littéral de Chaîne de Concaténation (http://docs.python.org/), ce qui pourrait être qualifié d'un, quelque part entre l'Option 2 et Option 4

Exemple De Code:

sql = ('select field1, field2, field3, field4 '
       'from table '
       'where condition1=1 '
       'and condition2=2 ')

Pour:

  1. Il conserve la pythonic bien comptées format, mais ne pas ajouter de superflu et de l'espace des personnages (qui pollue l'exploitation forestière).
  2. Il évite la barre oblique inverse poursuite de la laideur de l'Option 4, ce qui rend difficile d'ajouter des déclarations (sans parler de l'espace blanc de la cécité).
  3. Et de plus, il est vraiment simple à développer l'instruction dans VIM (suffit de positionner le curseur au point d'insertion, puis appuyez sur MAJ + O pour ouvrir une nouvelle ligne).

23voto

cdlk Points 346

Vous avez de toute évidence considéré comme beaucoup de façons d'écrire du SQL telle qu'elle imprime bien, mais comment sur la modification de la "imprimer" de la déclaration que vous utilisez pour l'enregistrement de débogage, plutôt que d'écrire de SQL dans les moyens que vous n'aimez pas? À l'aide de votre favori l'option ci-dessus, quelle est la fonction de connexion comme ceci:

def debugLogSQL(sql):
     print ' '.join([line.strip() for line in sql.splitlines()]).strip()

sql = """
    select field1, field2, field3, field4
    from table"""
if debug:
    debugLogSQL(sql)

Ce serait aussi facile d'ajouter de la logique supplémentaire pour diviser le connecté chaîne de caractères sur plusieurs lignes si la ligne est plus longue que la longueur souhaitée.

-1voto

jcomeau_ictx Points 15736

vous pourriez mettre les noms de champ dans un tableau "champs", et puis:


sql = 'select %s from table where condition1=1 and condition2=2' % (
 ', '.join(fields))

-1voto

Michal Chruszcz Points 1446

Je suggère de rester à l'option 2 (je suis toujours à l'utiliser pour les requêtes plus complexes que d' SELECT * FROM table) et si vous voulez l'imprimer, et de bien belle façon, vous pouvez toujours utiliser un module séparé.

-2voto

John Machin Points 39706
sql = """\
select field1, field2, field3, field4
from table
where condition1=1
and condition2=2
"""

[modifier dans responese de commentaire]
Avoir une chaîne SQL à l'intérieur d'une méthode ne signifie PAS que vous avez à "compiler" c':

>>> class Foo:
...     def fubar(self):
...         sql = """\
... select *
... from frobozz
... where zorkmids > 10
... ;"""
...         print sql
...
>>> Foo().fubar()
select *
from frobozz
where zorkmids > 10
;
>>>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X