2016-08-29 20 views
0

現在、Google App Engine for Pythonでアプリケーションを作成しています。私は自分のデータストアの最初のレコードをフェッチしたいが、何らかの理由でこれがうまくいかない。これは私がMySQLの中でそれを行うだろうかです:GAEのNDBデータストアから最初のレコードを取得する

SELECT * FROM MyClass LIMIT 1; 

私はNDBに新たなんだので、私は非常にこれがどのように機能するかのまわりで私の頭を包むように見えることはできません。私は例のためにthe documentationを読むことを試みたが、それらはかなり働かない。

これは私が現在持っているコードです:これは私の完全なスタックトレースである

from google.appengine.ext.ndb import Model as NdbModel 
from google.appengine.ext.ndb import StringProperty 


class Model(NdbModel): 

    @classmethod 
    def get_first(cls): 
     """ 
     Get the first record in the model datastore 
     :return: Model 
     """ 
     try: 
      return cls.query().fetch(1)[0] 
     except IndexError: 
      raise ModelException("No records found in [%s] datastore" % cls.__name__) 


class MyClass(Model): 
    foo = StringProperty() 
    bar = StringProperty() 

a = MyClass.get_first() # TypeError: 'NoneType' object does not support item assignment 

TypeError: 'NoneType' object does not support item assignment 
    at _store_value (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py:1127) 
    at _deserialize (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py:1496) 
    at _from_pb (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py:3209) 
    at pb_to_entity (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py:691) 
    at pb_to_query_result (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/datastore/datastore_rpc.py:201) 
    at _process_results (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/datastore/datastore_query.py:2980) 
    at __query_result_hook (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/datastore/datastore_query.py:2947) 
    at get_result (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py:613) 
    at _on_rpc_completion (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py:513) 
    at _run_to_list (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/query.py:995) 
    at _help_tasklet_along (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py:427) 
    at get_result (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py:383) 
    at fetch (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/query.py:1218) 
    at positional_wrapper (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/utils.py:160) 
    at get_first (/base/data/home/apps/s~project-id/v1.395271489319521947/project/core/models/utils.py:55) 
    at me (/base/data/home/apps/s~project-id/v1.395271489319521947/project/core/routes/api/v1/profile.py:22) 
    at dispatch_request (/base/data/home/apps/s~project-id/v1.395271489319521947/lib/flask/app.py:1625) 
    at full_dispatch_request (/base/data/home/apps/s~project-id/v1.395271489319521947/lib/flask/app.py:1639) 
    at handle_user_exception (/base/data/home/apps/s~project-id/v1.395271489319521947/lib/flask/app.py:1544) 
    at full_dispatch_request (/base/data/home/apps/s~project-id/v1.395271489319521947/lib/flask/app.py:1641) 
    at wsgi_app (/base/data/home/apps/s~project-id/v1.395271489319521947/lib/flask/app.py:1988) 
    at handle_exception (/base/data/home/apps/s~project-id/v1.395271489319521947/lib/flask/app.py:1567) 
    at wsgi_app (/base/data/home/apps/s~project-id/v1.395271489319521947/lib/flask/app.py:1991) 
    at __call__ (/base/data/home/apps/s~project-id/v1.395271489319521947/lib/flask/app.py:2000) 
    at Handle (/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py:267) 
+1

完全なトレースバックを表示します。しかし、データストアを通常のデータベースと考えるのは誤りです。順序付けの唯一の概念は索引によって提供されます。 –

+1

私は 'ValueError:[MyClass] datastore'にレコードが見つかりませんでした(私は未定義の' ModelException'を 'ValueError'に置き換えました)。だからあなたの問題はどこかにあるかもしれません。また、 'first'は結果リストの最初のことを意味します。もしあなたが何か別の意味を持っていれば、ソートルールも提供する必要があります。 –

+0

@DanielRosemanが私のスタックトレースを追加しました – Paradoxis

答えて

1

あなたがデータを取得しようとしているようですが、それは直後ようですデータストアに書き込まれます。これは、App EngineのStoring Data in Cloud Datastoreドキュメントに記載されているように各エンティティに同じparent keyを設定しない限り動作しません。

parent keyを作成するには、あなたが書くことができる:

from google.appengine.ext.ndb import Key 
parent_key = Key('my_data', 'version_1') 
を、あなたのエンティティを作成するときに constructorparent keyを渡す必要があります。

my_entity = MyKindClass(parent=parent_key, foo=foo_input, bar=bar_input) 

次に、あなたが通過してデータベースを照会あなたのkindクラスのparent_keyqueryメソッド:

first_result = MyKindClass.query(
      ancestor=parent_key).order(-MyKindClass.created).get() 

あなたは最新のデータを入手することに興味があると思うので、orderメソッドを使用して結果を注文し、-のデータを降順で注文します。さらに、fetch(1)の代わりにgetメソッドを使用して、最初のクエリ結果を返します。データがない場合はNoneを返します。

完全なコードは次のようになります。

詳細について
import webapp2 
from google.appengine.ext.ndb import (
    Model, StringProperty, DateTimeProperty, Key) 


class MyKindClass(Model): 
    foo = StringProperty() 
    bar = StringProperty() 
    created = DateTimeProperty(auto_now_add=True) 


parent_key = Key('my_data', 'version_1') 


class MainHandler(webapp2.RequestHandler): 

    def get(self): 
     foo_input = self.request.get('foo') 
     bar_input = self.request.get('bar') 
     if foo_input and bar_input: 
      my_entity = MyKindClass(parent=parent_key, 
            foo=foo_input, bar=bar_input) 
      my_entity.put() 

     first_result = MyKindClass.query(
      ancestor=parent_key).order(-MyKindClass.created).get() 
     if first_result is not None: 
      self.response.write('foo: %s, and bar: %s' % 
           (first_result.foo, first_result.bar)) 
     else: 
      self.response.write('No data yet!') 

app = webapp2.WSGIApplication([ 
    ('/', MainHandler) 
], debug=True) 

、App EngineのThe Python NDB Client Library Overviewドキュメントを参照してください。

関連する問題