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...
3 réponses
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(['...']))
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.
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.
Questions connexes
De nouvelles questions
dynamic
Dynamique est un terme largement utilisé qui, en général, décrit une décision prise par le programme au moment de l'exécution plutôt qu'au moment de la compilation.