7

对于了解 SQL 的人来说,GQL 是否容易学习?Django/Python 怎么样?App Engine 真的让扩展变得容易吗?是否有针对“GQL 注入”的内置保护?等等...

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

干杯!

4

6 回答 6

7

我对谷歌应用引擎的体验非常棒,1000 个结果的限制已被删除,这里是发布说明的链接:

应用引擎发行说明

不再有 1000 个结果限制 - 没错:随着游标的添加以及过去几个月中许多较小的 Datastore 稳定性和性能改进达到顶峰,我们现在有足够的信心完全取消最大结果限制。无论您是进行获取、迭代还是使用游标,结果的数量都没有限制。

于 2010-04-27T04:00:13.517 回答
4

最明显和令人沮丧的问题是数据存储 api,如果您习惯 SQL,它看起来很棒并且经过深思熟虑并且易于使用,但是所有查询结果集的行数限制为 1000 行,并且您无法访问计数或超出此范围的偏移量。我遇到了更奇怪的问题,一旦模型超过 1000 行,实际上就无法添加或访问模型的数据。

请参阅有关 1000 行限制的 Stack Overflow 讨论

阿拉尔巴尔干对这个问题和其他问题写了一个非常好的总结

话虽如此,应用程序引擎是一个非常棒的工具,可供使用,我真的很喜欢使用它。它非常适合部署微型 Web 服务(例如:json api's)以在其他应用程序中使用。

于 2009-04-01T09:23:11.713 回答
4

GQL 非常简单——它是 SQL 'SELECT' 语句的一个子集,仅此而已。不过,它只是底层 API 之上的一个便利层,所有的解析都是在 Python 中完成的。

相反,我建议使用 Query API,它是程序性的,不需要运行时解析,并且完全不可能出现“GQL 注入”漏洞(尽管它们在正确编写的 GQL 中是不可能的)。Query API 非常简单:在 Model 类上调用 .all(),或调用 db.Query(modelname)。Query 对象具有 .filter(field_and_operator, value)、.order(field_and_direction) 和 .ancestor(entity) 方法,以及 GQL 对象具有的所有功能 (.get()、.fetch()、.count())等)为了方便起见,每个 Query 方法都返回 Query 对象本身,因此您可以将它们链接起来:

结果 = MyModel.all().filter("foo =", 5).order("-bar").fetch(10)

相当于:

结果 = MyModel.gql("WHERE foo = 5 ORDER BY bar DESC LIMIT 10").fetch()

于 2009-04-01T10:19:05.180 回答
4

使用 AppEngine 时的一个主要缺点是 1k 查询限制,这已在评论中提到。不过,我没有看到的是有一个内置的可排序顺序,您可以使用它来解决这个问题。来自 appengine 食谱:

def deepFetch(queryGen,key=None,batchSize = 100):
  """ 批量生成实体的迭代器。

  参数:
    queryGen:应该返回一个 Query 对象
    key: 用于 .filter() for __key__
    batchSize:在一次数据存储调用中检索多少个实体

  取自 http://tinyurl.com/d887ll(AppEngine 食谱)。
  """

  从 google.appengine.ext 导入数据库

   # AppEngine 不会获取超过 1000 个结果
  batchSize = min(batchSize,1000)

  查询 = 无
  完成 = 假
  计数 = 0

  如果键:
    键 = db.Key(键)

  虽然没有完成:
    打印计数
    查询 = queryGen()
    如果键:
      query.filter("__key__ > ",key)
    结果 = query.fetch(batchSize)
    结果的结果:
      计数 += 1
      产出结果
    如果 batchSize > len(结果):
      完成=真
    别的:
      键=结果[-1].key()

上面的代码与 Remote API(参见这篇文章)一起允许您检索任意数量的实体。

您可以像这样使用上面的代码:

def allMyModel():
  q = MyModel.all()

myModels = deepFetch(allMyModel)
于 2009-04-05T13:32:20.170 回答
2

起初,我和其他从 SQL 过渡到 GQL 的人有同样的经历——不能进行 JOIN、计数超过 1000 行等有点奇怪。现在我已经使用它几个月了,我绝对喜欢应用引擎。我正在将我所有的旧项目移植到它上面。

我用它来托管几个高流量的 Web 应用程序(在高峰时间,其中一个获得 5 万次点击一分钟。)

于 2009-04-06T21:50:33.893 回答
1

Google App Engine 不使用实际的数据库,并且显然使用某种分布式哈希映射。这将有助于一些习惯 SQL 的人一开始不会看到的不同行为。因此,例如,在常规 SQL 中获取 COUNT 个项目预计会是一个快速操作,但对于 GQL,它只是不会以相同的方式工作。

这里还有一些问题:

http://blog.burnayev.com/2008/04/gql-limitations.html

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

于 2009-04-01T17:15:19.207 回答