您在 Google App Engine 上进行开发有啥经验?

Posted

技术标签:

【中文标题】您在 Google App Engine 上进行开发有啥经验?【英文标题】:What's your experience developing on Google App Engine?您在 Google App Engine 上进行开发有什么经验? 【发布时间】:2010-10-16 18:37:37 【问题描述】:

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

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

干杯!

【问题讨论】:

【参考方案1】:

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

app-engine release notes

不再有 1000 个结果限制 - 就是这样 右:添加光标和 许多较小的高潮 数据存储稳定性和性能 过去几个月的改进, 我们现在有足够的信心移除 最大结果限制。 无论你是在取货, 迭代,或使用游标,有 结果数量没有限制。

【讨论】:

【参考方案2】:

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

见Stack Overflow discussion about the 1000 row limit

阿拉尔巴尔干半岛wrote a really good summary of this and other problems

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

【讨论】:

已修复! ***.com/questions/264154/…【参考方案3】:

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 对象本身,因此您可以将它们链接起来:

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

相当于:

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

【讨论】:

【参考方案4】:

使用 AppEngine 时的一个主要缺点是 1k 查询限制,这已在 cmets 中提到。不过,我没有看到的是有一个内置的可排序顺序,您可以使用它来解决这个问题。 来自 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()

上述代码与远程 API(请参阅this article)一起允许您检索所需数量的实体。

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

这里还有一些问题:

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

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

【讨论】:

以上是关于您在 Google App Engine 上进行开发有啥经验?的主要内容,如果未能解决你的问题,请参考以下文章

App Engine - 为邻近搜索预先计算边界框

在 Google-App-Engine 中使用 HSQLDB

Google Cloud 中的 Google Compute Engine、App Engine 和 Container Engine 有啥区别?

连接 Google App Engine 和 Google Compute Engine

Google App Engine Flexible 和 Google Container Engine 之间的区别?

如何在 Google Cloud App Engine 上使用 PubSub 创建订阅者,该订阅者通过 Publisher 从 Google Cloud App Engine Flex 收听消息?