目标是减少一段经常运行的代码的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)
我是否缩短了此实体的获取时间?
我试图找出如何在除唯一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)
在上面的示例中,如何在整个数据库中强制实施电子邮件值的唯一性?
丹尼尔
通常,对于给定对象,最好对单个查询与许多查询进行比较.假设我有一堆"儿子"物品,每个物品都有一个"父亲".我得到了所有'儿子'对象:
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.
我这样做了吗?
使用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)
有任何想法吗 ?谢谢 !
我编写了一个应用程序,其中一部分是使用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%}
</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().我的理解在哪里出错了?
在许多情况下,使用Google Application Engine了解数据存储区中表(一种)中的行数可能很有用.
没有明确而快速的解决方案.至少我没有找到一个..你呢?
我正在寻找一个与app引擎兼容的Python库,并提供Twitter API的接口.
我发现了python-twitter项目 - 有没有人在app引擎上使用它?
我正在通过编写一个简单的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)
这是一个非常脆弱的脚本,但希望有人(除了我)会发现它很有用.
我正在使用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",但上述两个查询都会返回数据存储区中的所有用户实体.
有没有人有任何示例代码用于创建唯一的数字序列,以用作Google应用引擎数据存储区中的实体的键?
想使用顺序订单号作为关键.