11
votes

Sqlalchemy retourne tuple pas dictionnaire

J'ai mis à jour Sqlalchemy à 0.6 mais ça a tout cassé. J'ai remarqué qu'il retourne tuple pas un dictionnaire plus. Voici une requête d'échantillon: xxx

Ce morceau de code utilisé pour renvoyer un dictionnaire dans 0,5.

Ma question est comment puis-je retourner un dictionnaire? < / p>


1 commentaires

Juste curieux: pourquoi ne faites-vous pas session.Query (utilisateur) .get (id) (en supposant que User.ID est la clé primaire). Ou session.Quisery (utilisateur) .Filter (user.id == id) .Filter (utilisateur.Ausername == nom d'utilisateur) .First () Si ID n'est pas une clé primaire. Faites cela et vous récupérerez une instance utilisateur et vous pouvez accéder aux valeurs de champ par la recherche d'attribut.


3 Réponses :


7
votes

Cela devrait fonctionner: dict (zip (["id '," nom d'utilisateur "," e-mail "], résultat)) (ou vous pouvez utiliser une compréhension dictionnaire si vous êtes sur Python 3.x).
De plus, vous n'avez pas besoin d'appeler session.execute sur un session.Query objet. Vous voudrez utiliser la méthode () sur elle à la place. Cela évite également la nécessité pour le .Limit (1) appel à la fin de votre requête.


1 commentaires

Oui cela fonctionne. Merci. J'utilise la limite (1) parce que lorsque je regarde la déclaration SQL SQLALCHEMY crée pour ce code, il n'inclut pas la limite 1 dans la requête.



13
votes

Êtes-vous sûr que ce n'est pas un RENFOREPROXY qui prétend être un tuple lorsque vous l'imprimez? De nombreux objets dans l'orèse ne sont pas ce que leur __ str __ fonctionne la fonction.


1 commentaires

+1 J'étais totalement aveugle par ce que je voyais jusqu'à ce que je lisais cela. Après avoir lu, je viens d'aller de l'avant et j'ai essayé d'utiliser les noms de champ et cela fonctionnait parfaitement! M'a sauvé beaucoup de mal de tête. Merci.



40
votes

session.execute n'a jamais retourné de dict, il renvoie un objet RowProxy, qui peut être indexé comme un dict à l'aide des touches entier pour la recherche de position, les touches de chaîne pour les objets de recherche ou de colonne basés sur l'étiquette pour rechercher la valeur de cette colonne. Le problème ici est que session.execute (requête) ne fait pas ce que vous semble vous attendre à ce que cela fasse. Il convertit l'objet de requête en une instruction SELECT, exécute cela et renvoie directement le résultat. Les Resulatset ne savent rien des fonctionnalités de niveau ORM. Ce qui a changé entre 0.5 AD 0.6 est que ORM utilise un algorithme différent pour étiqueter les colonnes dans les requêtes, elle réplique désormais le nom de la table à l'étiquette. Donc, lorsque le fichier précédemment [ID '] est arrivé à travailler, maintenant ligne ["users_id'] fonctionne. Dans les deux cas rangée [utilisateur .__ Table __. Colonnes ['ID']]] fonctionne.

Pour exécuter les requêtes ORM, vous devez réellement utiliser le () , < code> .First () et .One () méthodes ou itérer sur elle ou en utilisant une indexation numérique. Retury renvoie des objets tuples nommés. Zip le tuple avec ses clés si vous voulez un dict: xxx


0 commentaires