Question

Disons que j'ai un modèle comme celui-ci

class Foo(db.Model):
    id = db.StringProperty()
    bar = db.StringProperty()
    baz = db.StringProperty()

Et je vais un GqlQuery comme ça

foos = db.GqlQuery("SELECT * FROM Foo")

Je souhaite utiliser les résultats de GqlQuery pour les transformer en une sorte de chaîne JSON que je peux manipuler à partir de différentes langues.

Voici comment je le fais maintenant

  1. Ajouter une méthode à la classe Foo qui la convertit en dictionnaire

    def toDict(self):
        return {
             'id': self.id,
             'bar': self.bar,
             'baz': self'baz
           }
    
  2. Parcourez les résultats de GqlQuery et ajoutez manuellement chaque instance de Foo à un dictionnaire

    fooDict = {}
    
    for foo in foos:
        fooDict[foo.id] = foo.toDict()
    
    return simplejson.dumps(fooDict)
    

Mon approche ci-dessus fonctionne, mais elle semble assez dégoûtante.

Existe-t-il une solution plus propre, plus "Pythonic"? façon de gérer cela?

Le format de fin n'a pas besoin d'être exactement ce que j'ai fait ci-dessus. Il faut juste que ce soit quelque chose qui convertisse bien en JSON afin que je puisse le gérer à partir de Javascript / PHP / peu importe.

Était-ce utile?

La solution

Consultez google .appengine.api.datastore . Google.appengine.ext.db s'appuie sur l'API de banque de données de niveau inférieur et renvoie les objets Entity, sous-classe dict. Vous pouvez l'interroger à l'aide de GQL avec google.appengine.ext.gql , ou (à ma préférence personnelle), utilisez la classe Query, ce qui vous évite de devoir créer des chaînes de texte que l'analyseur GQL peut analyser. La classe Query dans api.datastore se comporte exactement comme celle documentée ici . (mais renvoie les objets Entity de niveau inférieur au lieu des instances de modèle).

Par exemple, votre requête ci-dessus peut être reformulée en "datastore.Query (" Foo "). all ()".

Autres conseils

Je ne peux pas faire mieux que cela, mais voici quelques idées:

class Foo:
    id = db.StringProperty() # etc.
    json_attrs = 'id bar baz'.split()

# Depending on how easy it is to identify string properties, there
# might also be a way to assign json_attrs programmatically after the
# definition of Foo, like this
Foo.json_attrs = [attr for attr in dir(Foo)
                  if isStringProperty(getattr(Foo, attr))]

fooDict=dict((foo.id,dict(getattr(foo, attr)
                          for attr in Foo.json_attrs))
              for foo in foos)

http://code.google.com/p/google-app-engine-samples/source/browse/trunk/geochat/json.py?r=55

La méthode de l'encodeur résoudra vos besoins GQL-à-JSON. Je vous recommande de vous débarrasser de certaines des options de datetime excessives… comme une époque? vraiment?

Vous pouvez utiliser Web2py sur GAE et faire:

db.define_table('foo',SQLField('bar'),SQLField('baz'))
rows=db(db.foo.id>0).select()
### rows is a list, rows.response is a list of tuples
for row in rows: print  dict(row)

Fonctionne sur Oracle, Postgresql, Mssql, mysql, etc ... aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top