J'utilise l'ORM de SQL Alchemy et je constate que lorsque je renvoie une seule colonne, j'obtiens les résultats suivants :
[(result,), (result_2,)] # etc...
Avec un ensemble comme celui-ci, je trouve que je dois le faire souvent :
results = [r[0] for r in results] # So that I just have a list of result values
Ce n'est pas si "mauvais" car mes ensembles de résultats sont généralement petits, mais s'ils ne l'étaient pas, cela pourrait ajouter des frais généraux importants. Le plus gros problème est que j'ai l'impression que cela encombre la source, et manquer cette étape est une erreur assez courante que je rencontre.
Existe-t-il un moyen d'éviter cette étape supplémentaire ?
Une parenthèse connexe : Ce comportement de l'orm semble peu pratique dans ce cas, mais dans un autre cas où mon ensemble de résultats était, [(id, valeur)], il se termine comme ceci :
[(result_1_id, result_1_val), (result_2_id, result_2_val)]
Je peux alors juste faire :
results = dict(results) # so I have a map of id to value
Celle-ci a l'avantage d'avoir un sens en tant qu'étape utile après le retour des résultats.
Est-ce vraiment un problème ou est-ce que je suis juste un pinailleur et le post-traitement après avoir obtenu l'ensemble des résultats est logique dans les deux cas ? Je suis sûr que nous pouvons penser à d'autres opérations courantes de post-traitement pour rendre l'ensemble des résultats plus utilisable dans le code de l'application. Existe-t-il des solutions performantes et pratiques dans tous les cas ou le post-traitement est-il inévitable et simplement nécessaire pour des usages applicatifs différents ?
Lorsque mon application peut réellement tirer parti des objets renvoyés par l'ORM de SQL Alchemy, il semble extrêmement utile, mais dans les cas où je ne peux pas ou ne veux pas, pas tellement. S'agit-il d'un problème commun aux ORM en général ? Est-il préférable de ne pas utiliser la couche ORM dans des cas comme celui-ci ?
Je suppose que je devrais montrer un exemple des requêtes orm dont je parle :
session.query(OrmObj.column_name).all()
ou
session.query(OrmObj.id_column_name, OrmObj.value_column_name).all()
Bien sûr, dans une requête réelle, il y a normalement des filtres, etc.