标签: app-engine-ndb

NDB与DB(在High Replication数据存储区上)的速度比较是什么?

摘自Python NDB概述:

当应用程序读取实体时,该实体会自动缓存; 这为经常读取的实体提供了快速(且便宜)的读取.

...

写入数据的NDB函数(例如put())在高速缓存失效后返回; Apply阶段异步发生.

在Youtube上观看,Google I/O 2011:更多9s请:在高复制数据存储的封面下,在13:11-ish,平均延迟是:

主从:

  • 阅读:15ms
  • 写:20ms

高复制:

  • 阅读:15ms
  • 写:45ms

从应用程序的角度来看,NDB对这些速度的影响有多大?

编辑:特别好奇时序统计(以毫秒为单位).

额外信用:我也听过尼克约翰逊提到每个约160毫秒的询问(2009年)[link]NDB是否提供查询的任何速度优势?

google-app-engine app-engine-ndb google-cloud-datastore

14
推荐指数
2
解决办法
4680
查看次数

ndb建模一对多:重复KeyProperty与外键的优点

我的问题是关于在ndb中建模一对多关系.我知道这可以(至少)以两种不同的方式完成:使用重复属性或使用"外键".我在下面创建了一个小例子.基本上我们有一篇文章可以有任意数量的标签.我们假设可以删除标记,但添加标记后无法更改.我们还假设我们不担心交易安全.

我的问题是:建模这些关系的首选方式是什么?

我的考虑:

  • 方法(A)要求为每个标签添加两个写入(一个用于文章,一个用于标签),而方法(B)只需要一个写入(只有标签).
  • 方法(A)在获取文章的所有标签时利用ndb的缓存机制,而在方法(B)的情况下需要查询(以及一些自定义缓存)

是否有一些我在这里缺少的东西,还有其他需要考虑的因素吗?

非常感谢您的帮助.

例子(A):

class Article(ndb.Model):
    title = ndb.StringProperty()
    # some more properties
    tags = ndb.KeyProperty(kind="Tag", repeated=True)

    def create_tag(self):
        # requires two writes
        tag = Tag(name="my_tag")
        tag.put()
        self.tags.append(tag)
        self.put()

    def get_tags(self):
        return ndb.get_multi(self.tags)

class Tag(ndb.Model):
    name = ndb.StringProperty()
    user = ndb.KeyProperty(Kind="User") #  User that created the tag
    # some more properties
Run Code Online (Sandbox Code Playgroud)

实施例(B):

class Article(ndb.Model):
    title = ndb.StringProperty()
    # some more properties

    def create_tag(self):
        # requires one write
        tag = Tag(name="my_tag", article=self.key)
        tag.put()

    def get_tags(self):
        # obviously …
Run Code Online (Sandbox Code Playgroud)

google-app-engine app-engine-ndb

14
推荐指数
1
解决办法
5762
查看次数

ndb to_dict方法不包含对象的键

我正在利用ndb的to_dict方法将对象的属性转换为python dict.从我可以告诉的一切,根据文档,此方法不包括dict中对象的键或父级:

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict

但是对于我的情况,我需要关键词在dict中.我的偏好是利用内置方法和子类或类似的东西而不是创建我自己的to_dict方法.

实现这一目标的最佳方法是什么,或者我错过了一些明显的东西?提前致谢.

仅供参考:我不是在为这个项目利用django而是直接将python部署到gae.

python google-app-engine app-engine-ndb

14
推荐指数
1
解决办法
6391
查看次数

如何干净地删除ndb属性

在我的应用程序中,我需要删除一些我的模型属性.
我检查了该链接,但第一个问题是,性能上polymodel并没有这样的IM没有要切换到expando的时间,除去性能,即时通讯甚至不舒尔会发生什么,如果我换polymodel一个expando.

那么如何从现有实体中删除属性?

我正在考虑将所有内容设置StringPropertyNone然后从模型架构中删除它们并重新部署.其中一个属性是a BooleanProperty,我不能把这个设置为None对吗?!或者ndb.PickleProperty...我应该如何删除它?

有人知道如何正确完成这项工作吗?

python google-app-engine polymodel app-engine-ndb

13
推荐指数
1
解决办法
3970
查看次数

带有ndb的GAE出错 - BadQueryError:无法将FalseNode转换为谓词

我有一个使用python在Google App Engine上运行的应用程序.模型类从ndb(google.appengine.ext.ndb)类扩展而来.

我的一个视图对数据库进行异步调用,或多或少类似:

# ExerciseListLog is a ndb model class
# start_current, end_current are dates
# student_id is a string
# contents is a list of keys

exercise_log_query = ExerciseListLog.query(ndb.AND(ExerciseListLog.creation >= start_current,
    ExerciseListLog.creation < end_current,
    ExerciseListLog.user_id == student_id))
exercise_log_query = exercise_log_query.filter(ExerciseListLog.content.IN(contents))

future = exercise_log_query.count_async()

count = future.get_result() # this throws BadQueryError
Run Code Online (Sandbox Code Playgroud)

这是在get_result()上抛出一个错误:BadQueryError:无法将FalseNode转换为谓词

但只有在我将代码部署到Google云时才会发生这种情况.当我在本地运行它时工作正常.

我不知道这个错误意味着什么,在Google上查找并没有多大帮助.谁知道这里有什么问题?

这是GAE日志的完整堆栈跟踪

Traceback (most recent call last):
  File "/base/data/home/apps/s~qmagtest/1.366092357976105290/zen/web/gae/convention.py", line 48, in make_convention
    method(*args, **kwargs)
  File "/base/data/home/apps/s~qmagtest/1.366092357976105290/core/web/qmhandler.py", line 48, in wrapper
    return method(self, *args, **kwargs)
  File …
Run Code Online (Sandbox Code Playgroud)

python google-app-engine app-engine-ndb

13
推荐指数
1
解决办法
2411
查看次数

如何在Google App Engine(Python)NDB/Datastore中从子实体查询父实体?

我的问题非常基础,我想知道从App Engine Python中的子项访问父实体的属性值的直接和正确的方法.例如,我有以下模型架构.我正在使用Python 2.7和NDB.

class Gallery(ndb.Model):
    category    = ndb.StringProperty()
    title       = ndb.StringProperty()
    subtitle    = ndb.StringProperty()

class Image(ndb.Model):
    blob_key    = ndb.BlobKeyProperty()
    title       = ndb.StringProperty()
    gallery     = ndb.StringProperty()
    is_slider   = ndb.StringProperty()
Run Code Online (Sandbox Code Playgroud)

这里"画廊"是"图像"的父母.他们形成一个实体组展览=> Gallery => Image.我想显示Image模型中的图像以及它们所属的图库细节.我可以从父级访问子实体(图库中的图像),但反之亦然.我不想在Gallery模型中将Image model用作StructuredProperty.我大部分时间都是基于其他标志而不是图库显示所有图像(如果is_slider ="是",则会从所有图像生成幻灯片.所以直接从图像查询)但仍然希望显示相关图库的信息为什么我想知道如何访问父数据.

我觉得这是一个非常通用的问题,并寻找一个简单的解决方案,如直接访问父级,而不是回到实体组的顶部,并使用一些复杂的逻辑查询Gallery模型.任何帮助表示赞赏.

google-app-engine python-2.7 app-engine-ndb google-cloud-datastore

12
推荐指数
1
解决办法
9740
查看次数

ndb.transaction_async()与事务内的异步调用

我正在将我的ndb代码库尽可能多地移动到异步中.有一种情况我不太清楚如何继续:交易.

在我看来,我有3种选择:

选项1:ndb.transaction()同步调用,并使事务的函数调用异步方法.

def option_1():
    @ndb.tasklet
    def txn():
        e = yield Foo.get_by_id_async(some_id)
        if e is None:
            e = yield Foo().put_async()
        raise ndb.Return(e)

    # The doc for ndb.transaction() says that it takes a function or tasklet.
    # If it's a tasklet, does it wait on the Future that is returned?
    # If it doesn't wait, what is the proper way to call a tasklet in a transaction
    # and get access to its return value?
    return ndb.transaction(txn)
Run Code Online (Sandbox Code Playgroud)

选项2:ndb.transaction() …

google-app-engine app-engine-ndb

12
推荐指数
1
解决办法
1302
查看次数

GAE ndb设计,性能和重复属性的使用

假设我有一个图片库,一张图片可能有100k +粉丝.哪种ndb设计更有效?

class picture(ndb.model):
    fanIds = ndb.StringProperty(repeated=True)
    ... [other picture properties]
Run Code Online (Sandbox Code Playgroud)

要么

class picture(ndb.model):
    ... [other picture properties]

class fan(ndb.model):
    pictureId = StringProperty()
    fanId = StringProperty()
Run Code Online (Sandbox Code Playgroud)

您可以添加到ndb重复属性的项目数量是否有任何限制,并且在重复属性中存储大量项目是否有任何性能损失?如果使用重复属性效率较低,它们的用途是什么?

google-app-engine python-2.7 app-engine-ndb google-cloud-datastore

12
推荐指数
2
解决办法
4139
查看次数

保持NDB数据库中属性的唯一性

NDB模型包含两个属性:emailpassword.如何避免向数据库添加两条记录相同email?对于属性,NDB没有UNIQUE选项,就像关系数据库那样.

email在添加之前检查new 不在数据库中 - 不会让我满意,因为两个并行进程可以同时进行检查并且每个进程都添加相同email.

我不确定交易可以在这里提供帮助,在阅读了一些手册之后我感觉不到这种印象.也许是同步交易?这是一次一个吗?

google-app-engine webapp2 app-engine-ndb

12
推荐指数
1
解决办法
4295
查看次数

google.appengine.ext.ndb和gcloud.datastore有什么区别?

ndb :(来自google.appengine.ext import ndb)

数据存储区:(来自gcloud import datastore)

有什么不同?我已经看到它们都使用了,并暗示它们都将数据保存到谷歌数据存储区.为什么有两种不同的实现?

google-app-engine app-engine-ndb google-cloud-datastore google-app-engine-python

12
推荐指数
1
解决办法
960
查看次数