对于懂SQL的人来说,GQL是否易于学习? Django / Python怎么样? App Engine是否真的能够轻松扩展?是否有针对“GQL注入”的内置保护?等等...
我很想听到使用应用引擎的不那么明显的起伏。
干杯!
答案 0 :(得分:7)
我使用谷歌应用引擎的经验很棒, 1000 结果限制已删除,这是发布说明的链接:
不再有1000个结果限制 - 那就是 右:加上游标和 许多小人物的高潮 数据存储的稳定性和性能 过去几个月的改进, 我们现在有足够的信心去除 最大限度的结果限制。 无论你是在取, 迭代,或使用Cursor,有 对结果数量没有限制。
答案 1 :(得分:4)
最引人注目和最令人沮丧的问题是数据存储api,它看起来很棒并且经过深思熟虑且易于使用,如果您习惯使用SQL,但在所有查询结果集中都有1000行限制,并且您可以' t访问计数或偏移超出此范围。我遇到了更棘手的问题,一旦超过1000行,实际上无法为模型添加或访问数据。
请参阅Stack Overflow discussion about the 1000 row limit
Aral Balkan wrote a really good summary of this and other problems
话虽如此,应用引擎是一个非常好的工具,我可以随心所欲地使用它。它非常适合部署微型Web服务(例如:json api)以在其他应用程序中使用。
答案 2 :(得分:4)
GQL非常简单 - 它是SQL“SELECT”语句的一个子集,仅此而已。它只是低层API顶层的便利层,所有解析都是用Python完成的。
相反,我建议使用查询API,它是程序性的,不需要运行时解析,并且使“GQL注入”漏洞完全不可能(尽管在正确编写的GQL中它们是不可能的)。 Query API非常简单:在Model类上调用.all(),或者调用db.Query(modelname)。 Query对象具有.filter(field_and_operator,value),. order(field_and_direction)和.ancestor(实体)方法,以及GQL对象具有的所有工具(.get(),。find(),. count())等等。为方便起见,每个Query方法返回Query对象本身,因此您可以链接它们:
results = MyModel.all()。filter(“foo =”,5).order(“ - bar”)。fetch(10)
相当于:
results = MyModel.gql(“WHERE foo = 5 ORDER BY bar DESC LIMIT 10”)。fetch()
答案 3 :(得分:4)
使用AppEngine时的一个主要缺点是1k查询限制,已经在评论中提到过。我没有看到的是,有一个内置的可排序顺序,你可以解决这个问题。 来自appengine cookbook:
def deepFetch(queryGen,key=None,batchSize = 100): """Iterator that yields an entity in batches. Args: queryGen: should return a Query object key: used to .filter() for __key__ batchSize: how many entities to retrieve in one datastore call Retrieved from http://tinyurl.com/d887ll (AppEngine cookbook). """ from google.appengine.ext import db # AppEngine will not fetch more than 1000 results batchSize = min(batchSize,1000) query = None done = False count = 0 if key: key = db.Key(key) while not done: print count query = queryGen() if key: query.filter("__key__ > ",key) results = query.fetch(batchSize) for result in results: count += 1 yield result if batchSize > len(results): done = True else: key = results[-1].key()
上述代码和Remote API(请参阅this article)允许您根据需要检索任意数量的实体。
您可以使用上面的代码:
def allMyModel(): q = MyModel.all() myModels = deepFetch(allMyModel)
答案 4 :(得分:2)
起初我和其他从SQL转换到GQL的人有同样的经历 - 有点奇怪,不能做JOIN,计数超过1000行等等。现在我已经和它合作了一些几个月我绝对喜欢app引擎。我将所有旧项目移植到它上面。
我用它来托管几个高流量的网络应用程序(在高峰时间,其中一个每分钟点击率达到5万次。)
答案 5 :(得分:1)
Google App Engine不使用实际数据库,显然使用某种分布式哈希映射。这将适用于一些不同的行为,习惯于SQL的人一开始就不会看到。因此,例如,在常规SQL中获取COUNT个项目预计会是一个快速操作,但是使用GQL它不会以相同的方式工作。
以下是一些问题:
http://blog.burnayev.com/2008/04/gql-limitations.html
根据我的个人经验,这是一个调整,但学习曲线很好。