Je travaille sur certains rapports (décomptes) et je dois récupérer des décomptes pour différents paramètres. Assez simple mais fastidieux.

Un exemple de requête pour un paramètre:

qCountsEmployee = (
    "select count(*) from %s where EmployeeName is not null"
     % (tablename)
     )
CountsEmployee = execute_query(qCountsEmployee)

Maintenant, j'ai quelques centaines de ces paramètres!

Ce que j'ai fait était de créer une liste de tous les paramètres et de les générer à l'aide d'un script Python rapide, puis de copier ce texte et de le placer dans le script principal pour éviter les lignes fastidieuses.

columnList = ['a', 'b', ............'zzzz']

for each in columnList:
   print (
            'q' + each + ' ='
            + '"select count(*) from %s where' + each
            + 'is not null" % (tablename)'
         )
   print each + '   = execute_query(' + 'q' + each + ')'

Pendant que cette approche fonctionne, je me demandais si au lieu d'un script séparé pour générer des lignes de code et copier-coller dans le programme principal, puis-je les générer directement dans le script principal et laisser le script les traiter comme des lignes de code? Je pense que cela rendra le code beaucoup plus lisible. J'espère que j'avais du sens! Je vous remercie...

4
ThinkCode 22 nov. 2011 à 21:55

3 réponses

Meilleure réponse

Ce serait possible, mais ce n'est pas utile ici.

Faites juste quelque chose comme

columnList = ['a', 'b', ............'zzzz']

results = {}
for column in columnList:
    query = (
            "select count(*) from " + tablename
            + " where " + column + " is not null"
            )
    result = execute_query(qCountsEmployee)
    results[column] = result

Vous pouvez également mettre tout cela ensemble dans une fonction de générateur et faire

def do_counting(column_list):
    for column in column_list:
        query = (
            "select count(*) from " + tablename
            + " where " + column + " is not null"
            )
        result = execute_query(qCountsEmployee)
        yield column, result

result_dict = dict(do_counting(['...']))
5
Ethan Furman 22 nov. 2011 à 21:20

Tu peux faire:

cmd = compile( 'a = 5', '<string>', 'exec' )
exec( cmd )

C'est la même chose que d'écrire:

a = 5

La chaîne passée comme premier argument à compiler peut être construite dynamiquement.

2
William Pursell 22 nov. 2011 à 18:01

Pour s'appuyer sur ce que glglgl a dit, vous êtes probablement meilleur avec le SQL dynamique qu'avec le Python dynamique (bien que le Python dynamique soit certainement possible en utilisant des choses comme eval). Lorsque vous travaillez avec Dynamic SQL, vous devez faire attention à l'injection SQL. Il semble que cela ne se produirait pas dans votre cas d'utilisation particulier, mais il apparaît certainement plus souvent que de nombreux développeurs ne le pensent.

Il se trouve que j'ai écrit un article sur Injection SQL et Python qui est disponible sur Simple-talk.

2
TimothyAWiseman 22 nov. 2011 à 22:27