GqlQueryの結果セットをPython辞書に変換する
-
03-07-2019 - |
質問
このようなモデルがあるとしましょう
class Foo(db.Model):
id = db.StringProperty()
bar = db.StringProperty()
baz = db.StringProperty()
そして、私はこのようなGqlQueryに行きます
foos = db.GqlQuery("SELECT * FROM Foo")
GqlQueryの結果を取得し、さまざまな言語から操作できる何らかのJSON文字列に変換したい。
これが今のやり方です
-
メソッドを辞書に変換する Foo クラスにメソッドを追加します
def toDict(self): return { 'id': self.id, 'bar': self.bar, 'baz': self'baz }
-
GqlQueryの結果をループし、各Fooインスタンスを辞書に手動で追加します
fooDict = {} for foo in foos: fooDict[foo.id] = foo.toDict() return simplejson.dumps(fooDict)
上記の私のアプローチは機能しますが、それは一種の大雑把に感じます。
よりクリーンで、より「Pythonic」なものはありますか?これを処理する方法?
終了形式は、上記で行ったとおりである必要はありません。それは、JSONにうまく変換できるものでなければならないので、Javascript / PHP / whateverから処理できます。
解決
googleをご覧ください.appengine.api.datastore 。これは、google.appengine.ext.dbが構築する下位レベルのデータストアAPIであり、エンティティクラスを返します。 GQLを使用して google.appengine.ext.gql 、または(私の個人的な好み)Queryクラスを使用します。これにより、GQLパーサーが解析するテキスト文字列を作成する必要がなくなります。 api.datastoreのQueryクラスは、こちらに記載されているものとまったく同じように動作します (ただし、Modelインスタンスの代わりに下位レベルのEntityオブジェクトを返します。)
例として、上記のクエリは" datastore.Query(" Foo")。all()"として再定式化できます。
他のヒント
それ以上のことはできませんが、いくつかのアイデアがあります:
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
エンコーダー方式は、GQL-to-JSONのニーズをうまく解決します。エポックとしての余分な日時オプションの一部を取り除くことをお勧めします。本当に?
GAEでweb2pyを使用して、以下を実行できます。
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)
Oracle、Postgresql、Mssql、mysqlなどでも実行されます。