对于了解 SQL 的人来说,GQL 是否容易学习?Django/Python 怎么样?App Engine 真的让扩展变得容易吗?是否有针对“GQL 注入”的内置保护?等等...
我很想听听使用应用引擎的不那么明显的起伏。
干杯!
对于了解 SQL 的人来说,GQL 是否容易学习?Django/Python 怎么样?App Engine 真的让扩展变得容易吗?是否有针对“GQL 注入”的内置保护?等等...
我很想听听使用应用引擎的不那么明显的起伏。
干杯!
我对谷歌应用引擎的体验非常棒,1000 个结果的限制已被删除,这里是发布说明的链接:
不再有 1000 个结果限制 - 没错:随着游标的添加以及过去几个月中许多较小的 Datastore 稳定性和性能改进达到顶峰,我们现在有足够的信心完全取消最大结果限制。无论您是进行获取、迭代还是使用游标,结果的数量都没有限制。
最明显和令人沮丧的问题是数据存储 api,如果您习惯 SQL,它看起来很棒并且经过深思熟虑并且易于使用,但是所有查询结果集的行数限制为 1000 行,并且您无法访问计数或超出此范围的偏移量。我遇到了更奇怪的问题,一旦模型超过 1000 行,实际上就无法添加或访问模型的数据。
请参阅有关 1000 行限制的 Stack Overflow 讨论
阿拉尔巴尔干对这个问题和其他问题写了一个非常好的总结
话虽如此,应用程序引擎是一个非常棒的工具,可供使用,我真的很喜欢使用它。它非常适合部署微型 Web 服务(例如:json api's)以在其他应用程序中使用。
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()
使用 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)
起初,我和其他从 SQL 过渡到 GQL 的人有同样的经历——不能进行 JOIN、计数超过 1000 行等有点奇怪。现在我已经使用它几个月了,我绝对喜欢应用引擎。我正在将我所有的旧项目移植到它上面。
我用它来托管几个高流量的 Web 应用程序(在高峰时间,其中一个获得 5 万次点击一分钟。)
Google App Engine 不使用实际的数据库,并且显然使用某种分布式哈希映射。这将有助于一些习惯 SQL 的人一开始不会看到的不同行为。因此,例如,在常规 SQL 中获取 COUNT 个项目预计会是一个快速操作,但对于 GQL,它只是不会以相同的方式工作。
这里还有一些问题:
http://blog.burnayev.com/2008/04/gql-limitations.html
以我个人的经验,这是一种调整,但学习曲线很好。