2016-11-15 2 views
0

Je crée une API pour un forum simple en utilisant pyramid et sqlalchemy. J'ai une vue que je veux simplement renvoyer certains messages sous forme json au client, lorsque l'utilisateur fait défiler jusqu'à la fin de la page. Pour une raison quelconque, la requête n'est même pas exécutée et un objet de requête est renvoyé à la place d'un objet rowproxy. C'est juste une question de test btw, je reçois juste quelques fois de la base de données et essaye de les envoyer en json.Pourquoi mon objet de requête n'est-il pas exécuté et reste un objet de requête?

@view_config(route_name='get-posts', renderer='json') 
def get-posts(request) 
    q = session.query(Topic).filter(Topic.name =='gaming')\ 
    .order_by(desc(Topic.topic_date)).limit(10) 
    results = [dict(zip(row.keys()) for row in q)] 
    return {'posts' : results} 

Lorsque cela est exécuté, je reçois « AttributeError: objet « Sujet » n'a pas de clés de attribtue », et après vérification du type de q, je découvre qu'il est de type: sqlalchemy.orm.query.Query

Est-ce que quelqu'un sait pourquoi la requête n'est pas exécutée? J'ai une fonction de vue non api où je fais pratiquement la même chose, et en retournant le résultat (un proxy de ligne comme le contenu d'un dictionnaire et cela fonctionne ...

+0

[dict (zip (row.keys()) pour la ligne dans q)] retournera un liste de longueur 1 où le seul élément est le dictionnaire. Est-ce que tu veux ça? –

+0

Ça va toujours être un objet de requête. C'est juste que l'itération sur la requête donne ses résultats. – kindall

+0

@JeffMandell Oui, j'essaie d'obtenir une version du dictionnaire des résultats de la requête pour que je puisse la retourner dans json – Jaigus

Répondre

2

Il y a des méthodes sur requête qui provoque l'exécution de la requête sous-jacente tout(), un(), premier(), etc.

Si vous avez besoin de l'objet de la requête en tant que liste, appelez tous() là-dessus.

@view_config(route_name='get-posts', renderer='json') 
def get-posts(request) 
    q = session.query(Topic).filter(Topic.name =='gaming')\ 
    .order_by(desc(Topic.topic_date)).limit(10) 
    return {'posts' : q.all()} 

Référence pour l'objet de requête: http://docs.sqlalchemy.org/en/latest/orm/query.html#the-query-object