ndb.gql vs ndb.query - Google App Engine

时间:2012-07-08 12:38:39

标签: python sql google-app-engine gql

https://developers.google.com/appengine/docs/python/ndb/

https://developers.google.com/appengine/docs/python/ndb/queries

ndb.gql和ndb.query之间有区别吗? (在语法旁边)

例如

cursor = ndb.gql("select * from Account")

vs

cursor = Account.query()

因为我喜欢ndb.query因为我认为它更具可读性

例如: acc=Account.query(Account.username==form.username.data,Account.password==form.password.data)

如果这两种方法在引擎盖下不同/相等,我找不到任何信息。

=>也许有性能权衡?

  

如果您习惯使用SQL,请在使用时注意错误的假设   GQL。 GQL被翻译为NDB的本机查询API。这是不同的   来自典型的Object-Relational映射器(如SQLAlchemy或Django的   数据库支持),其中API调用之前被转换为SQL   它们被传输到数据库服务器。 GQL不支持   数据存储修改(插入,删除或更新);它只是   支持查询。

我想ndb.query应该“更快”,因为它不需要正确翻译?

1 个答案:

答案 0 :(得分:8)

这些只是两种不同的方式来做同样的事情。选择在特定情况下更容易的人。你是对的,gql()理论上比较慢,因为它在解析后构建了一个Query对象,但我认为你不会注意到速度上的任何差异(假设你实际运行了查询: - )。 / p>

请注意,两者都返回相同类型的对象:

>>> q1 = Employee.query()
>>> q1
Query(kind='Employee')
>>> q2 = gql('SELECT * FROM Employee')
>>> q2
Query(kind='Employee', default_options=QueryOptions(offset=0))
>>> 

(default_options字段仅在GQL中使用OFFSET或LIMIT语法时才相关。)

所以你能用结果完全一样。您甚至可以使用.filter()和.order()方法将其他过滤器和订单应用于q2。