ndb.gql vs ndb.query - Google App Engine

Mai*_*ein 3 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")
Run Code Online (Sandbox Code Playgroud)

VS

cursor = Account.query()
Run Code Online (Sandbox Code Playgroud)

因为我喜欢ndb.query,因为我觉得它更具可读性

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

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

=>也许有性能权衡?

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

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

Gui*_*sum 8

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

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

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

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

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