繁体   English   中英

从GAE中的NDB数据存储中获取第一条记录

[英]Fetching first record from NDB datastore in GAE

我目前正在使用Google App Engine for Python编写应用程序。 我想获取数据存储区中的第一条记录,但是由于某种原因,这将无法正常工作。 这就是我要在MySQL中执行的操作:

SELECT * FROM MyClass LIMIT 1;

但是,由于我是NDB的新手,所以我似乎不太了解它的工作原理。 我尝试阅读文档中的示例,但它们并不起作用。

这是我目前拥有的代码:

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)

似乎您正在尝试将数据写入数据存储后立即检索数据,除非您按照App Engine的“ 在Cloud Datastore中存储数据”文档中所述在每个实体上设置了相同的parent key ,否则该数据将不起作用。

要创建parent key ,您可以编写:

from google.appengine.ext.ndb import Key
parent_key = Key('my_data', 'version_1')

创建实体时,应将parent key传递给constructor

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

然后,通过将parent_key传递给kind类的query方法来query数据库:

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

我认为您有兴趣获取最新数据,因此我使用带-运算符的order方法对结果进行了order ,该运算符对数据进行降序order 另外,我使用get方法代替fetch(1)来返回第一个查询结果,如果没有数据,则返回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的Python NDB客户端库概述文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM