小编Dav*_*ill的帖子

通过减少实体大小来提高App Engine性能

目标是减少一段经常运行的代码的CPU成本和响应时间,并且每次必须db.get()几百个密钥.

这甚至有用吗?

我可以期望具有数百个密钥的db.get()的API时间大致线性减少,因为我减小了实体的大小吗?目前的实体贴有以下数据:9字符串,布尔9,8整数,1 GeoPt,2日期时间,1个文本(平均大小:约100个字节FWIW),1个参考,1周的StringList(平均大小为500字节).目标是将绝大多数此类数据移动到相关类中,以便快速获取主模型的核心.

如果它确实有效,它是如何实现的?

在重构之后,我仍然需要获得相同的高成本获取现有实体吗?文档说明同时获取模型的所有属性.旧的不需要的属性是否会在我的硬币上转移到RPC而用户在等待?换句话说:如果我想减少实体的加载时间,是否有必要将旧实体迁移到具有新定义的实体?如果是这样,重新放入()实体是否足够,或者我必须在一个全新的密钥下保存?

考虑:

class Thing(db.Model):
    text    = db.TextProperty()
    strings = db.StringListProperty()
    num     = db.IntegerProperty()

thing = Thing(key_name='thing1', text='x' * 10240,
      strings = ['y'*500 for i in range(10)], num=23)
thing.put()
Run Code Online (Sandbox Code Playgroud)

假设我重新定义要精简的东西并推出一个新版本:

class Thing(db.Model):
    num = db.IntegerProperty()
Run Code Online (Sandbox Code Playgroud)

我再次取回它:

thing_again = Thing.get_by_key_name('thing1')
Run Code Online (Sandbox Code Playgroud)

我是否缩短了此实体的获取时间?

google-app-engine google-cloud-datastore

7
推荐指数
1
解决办法
2352
查看次数

如何在java Google App Engine中强制使用唯一字段值

我试图找出如何在除唯一ID之外的字段中强制执行唯一性.

例:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements IsSerializable {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String name; 

    @Persistent
    private String email; // <= I want this to be unique as well
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,如何在整个数据库中强制实施电子邮件值的唯一性?

丹尼尔

java google-app-engine

7
推荐指数
2
解决办法
2453
查看次数

访问相关对象键而不在App Engine中获取对象

通常,对于给定对象,最好对单个查询与许多查询进行比较.假设我有一堆"儿子"物品,每个物品都有一个"父亲".我得到了所有'儿子'对象:

sons = Son.all()
Run Code Online (Sandbox Code Playgroud)

然后,我想让那群儿子的所有父亲.我做:

father_keys = {}
for son in sons:
    father_keys.setdefault(son.father.key(), None)
Run Code Online (Sandbox Code Playgroud)

然后我可以这样做:

fathers = Father.get(father_keys.keys())
Run Code Online (Sandbox Code Playgroud)

现在,这假设son.father.key()实际上并没有获取对象.我错了吗?我有一堆代码假定object.related_object.key()实际上没有从数据存储区中获取related_object.

我这样做了吗?

python google-app-engine google-cloud-datastore

7
推荐指数
1
解决办法
550
查看次数

无法从数据存储区实体访问ID属性

使用Google App Engine SDK和Python,我遇到了一个问题:我无法访问给定实体属性的ID属性.我可以访问的唯一属性是我的类Model中定义的属性,以及key属性(请参阅下面的答案):

class Question(db.Model):
    text = db.StringProperty()
    answers = db.StringListProperty()
    user = db.UserProperty()
    datetime = db.DateTimeProperty()
Run Code Online (Sandbox Code Playgroud)

我可以很好地访问文本,答案,用户,日期时间和关键属性.但是,我无法访问ID属性.例如,在获取所有实体之后(使用Question.all()):

# OK Within a template, this will return a string :
{{ question.text }}
# OK, this will return the entity key :
{{ question.key }}

# KO this will return nothing :
{{ question.id }}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗 ?谢谢 !

python google-app-engine entity google-cloud-datastore

7
推荐指数
2
解决办法
1805
查看次数

.get()和.fetch(1)之间的区别是什么

我编写了一个应用程序,其中一部分是使用URL解析器以ReST类型的方式获取某些数据.因此,如果您将/ foo/bar作为路径,它将找到所有条形项目,如果您放置/ foo,它将返回foo下面的所有项目

所以我的应用程序有一个查询

data = Paths.all().filter('path =', self.request.path).get()
Run Code Online (Sandbox Code Playgroud)

哪个效果很好.现在我想使用模板将其发送到UI

{%for datum in data%}

{{datum.title}}

{{datum.content}}

   </div>
Run Code Online (Sandbox Code Playgroud)

{%endfor%}

当我这样做时,我得到的数据不是可迭代的错误.所以我更新了Django {% for datum in data.all %},现在它似乎比我给它提供更多的数据.它显示数据存储区中的所有数据都不理想.所以我从Django中删除了.all并将数据存储区查询更改为

data = Paths.all().filter('path =', self.request.path).fetch(1)
Run Code Online (Sandbox Code Playgroud)

现在按照我的意图运作.在文档中说

db.get()函数从数据存储区中获取Key(或Keys列表)的实体.

所以我的问题是为什么我可以在它返回fetch()但不能使用时迭代查询get().我的理解在哪里出错了?

python google-app-engine google-cloud-datastore

7
推荐指数
1
解决办法
2万
查看次数

如何获取数据存储区中表的行数?

在许多情况下,使用Google Application Engine了解数据存储区中表(一种)中的行数可能很有用.
没有明确而快速的解决方案.至少我没有找到一个..你呢?

size google-app-engine count google-cloud-datastore

7
推荐指数
2
解决办法
3462
查看次数

App Engine Python的Twitter库?

我正在寻找一个与app引擎兼容的Python库,并提供Twitter API的接口.

我发现了python-twitter项目 - 有没有人在app引擎上使用它?

python twitter google-app-engine oauth

7
推荐指数
2
解决办法
2383
查看次数

使用带有jsTestDriver的闭包库

我正在通过编写一个简单的JavaScript游戏来学习谷歌关闭工具.我无法弄清楚如何设置jsTestDriver以便它与闭包库一起使用.

具体来说:我想使用goog.require机制来包含任何其他JavaScript文件,而不必手动将它们全部添加到配置文件中.

根据meyertee的建议,我制作了一个简单的脚本来自动将依赖项写入配置文件

#!/bin/bash
cp tests/jsTestDriver.conf.proto tests/jsTestDriver.conf
libs/closure-library/closure/bin/build/closurebuilder.py --root="./libs/closure-library" --root="./js" --namespace="lds" | sed "s#^#  - \.\./#" >> tests/jsTestDriver.conf
Run Code Online (Sandbox Code Playgroud)

tests/jsTestDriver.conf.proto文件是一个简单的模板:

test:
  - "*.js"
load:
  - ../libs/knockout-2.1.0.js
# Crucial, the load key needs to be last, and this comment must be followed by a newline.
Run Code Online (Sandbox Code Playgroud)

这是一个非常脆弱的脚本,但希望有人(除了我)会发现它很有用.

unit-testing google-closure-library js-test-driver

7
推荐指数
1
解决办法
1174
查看次数

App引擎数据存储 - 在Enum字段上查询

我正在使用GAE(Java)和JDO来实现持久性.

我有一个带有Enum字段的实体,该字段标记为@Persistent并正确保存到数据存储区(从开发控制台中的数据存储区查看器中观察到).但是当我查询这些实体根据Enum值放置一个过滤器时,无论我为枚举字段指定了什么值,它总是返回所有实体.

我知道GAE java支持枚举像基本数据类型一样持久化.但它是否也允许基于它们进行检索/查询?Google搜索无法向我指出任何此类示例代码.

细节:

我在执行之前打印了Query.所以在两种情况下,查询看起来像 -

SELECT FROM com.xxx.yyy.User WHERE role == super ORDER BY key desc RANGE 0,50

SELECT FROM com.xxx.yyy.User WHERE role == admin ORDER BY key desc RANGE 0,50
Run Code Online (Sandbox Code Playgroud)

尽管数据存储区查看器显示某些用户类型为"admin"且某些类型为"super",但上述两个查询都会返回数据存储区中的所有用户实体.

java google-app-engine enums google-cloud-datastore

6
推荐指数
1
解决办法
2793
查看次数

生成唯一编号序列,以用作app引擎数据存储的实体密钥

有没有人有任何示例代码用于创建唯一的数字序列,以用作Google应用引擎数据存储区中的实体的键?

想使用顺序订单号作为关键.

python google-app-engine google-cloud-datastore

6
推荐指数
1
解决办法
4432
查看次数