您在Google App Engine上开发的经验是什么?

时间:2009-04-01 02:55:13

标签: google-app-engine gql

对于懂SQL的人来说,GQL是否易于学习? Django / Python怎么样? App Engine是否真的能够轻松扩展?是否有针对“GQL注入”的内置保护?等等...

我很想听到使用应用引擎的不那么明显的起伏。

干杯!

6 个答案:

答案 0 :(得分:7)

我使用谷歌应用引擎的经验很棒, 1000 结果限制已删除,这是发布说明的链接:

app-engine release notes

  

不再有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

根据我的个人经验,这是一个调整,但学习曲线很好。

相关问题