77 votes

SQL Alchemy ORM retournant une seule colonne, comment éviter le post traitement commun

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.

-3voto

user8814926 Points 40

Wow, les gars, pourquoi s'épuiser ? Il existe des méthodes plus raides, plus rapides et plus élégantes).

>>> results = [('result',), ('result_2',), ('result_3',)]
>>> sum(results, tuple())
('result', 'result_2', 'result_3')

Vitesse :

>>> timeit('result = zip(*[("result",), ("result_2",), ("result_3",)])', number=10000)
0.004222994000883773
>>> timeit('result = sum([("result",), ("result_2",), ("result_3",)], ())', number=10000)
0.0038205889868550003

Mais si plus d'éléments dans la liste - utiliser uniquement zip . Zip plus de vitesse.

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