真的很简单.在SQL中,如果我想在文本字段中搜索几个字符,我可以这样做:
SELECT blah FROM blah WHERE blah LIKE '%text%'
Run Code Online (Sandbox Code Playgroud)
App Engine的文档没有提到如何实现这一点,但肯定这是一个常见的问题吗?
如何在Google App Engine数据查看器中使用GQL针对实体密钥编写查询?
在查看器中,第一列(Id/Name)显示为name=_1
,在详细视图中,它将键显示为
Decoded entity key: Programme: name=_1
Entity key: agtzcG9...................
Run Code Online (Sandbox Code Playgroud)
此查询不起作用:
SELECT * FROM Programme where name = '_1'
Run Code Online (Sandbox Code Playgroud) 我想构建GQL查询以使用其数字ID获取对象.我在App管理控制台的Datastore查看器中这样做,所以我不能使用Model.get_by_id(numeric_id).就像是
SELECT * FROM Model WHERE id = <numeric_id>
Run Code Online (Sandbox Code Playgroud)
也行不通.
我认为计算的一种方法是这样的:
foo = db.GqlQuery("SELECT * FROM bar WHERE baz = 'baz')
my_count = foo.count()
Run Code Online (Sandbox Code Playgroud)
我不喜欢的是我的数量将限制在1000以上,我的查询可能会很慢.那里的人有解决方法吗?我有一个想法,但它感觉不干净.如果只有GQL有一个真正的COUNT函数......
我认为对于类似SQL的人来说这很容易!我想要的是GQL相当于:
select count(*) from foo;
Run Code Online (Sandbox Code Playgroud)
并回答类似的答案:
1972 records.
Run Code Online (Sandbox Code Playgroud)
我想从基于Web的DataStore查看器中的"命令行"在GQL中执行此操作.(你知道,一次显示20个,让我看到"下一个20")
无论如何 - 我确信这很容易让人脑筋流满为止,我似乎无法找到正确的语法.任何帮助,将不胜感激.
谢谢!
我在Google App Engine中有一个带有日期字段的简单表格.我想查询所有行,其中包含从现在到6小时之前的日期字段.我该如何形成这个查询?
使用google appengine数据存储区,有没有办法执行gql查询,在不区分大小写的StringProperty数据类型上指定WHERE子句?我并不总是确定该值的大小写.文档指定where对我的值区分大小写,有没有办法使这个不敏感?
例如db模型将是这样的:
from google.appengine.ext import db
class Product(db.Model):
id = db.IntegerProperty()
category = db.StringProperty()
Run Code Online (Sandbox Code Playgroud)
数据看起来像这样:
id category
===================
1 cat1
2 cat2
3 Cat1
4 CAT1
5 CAT3
6 Cat4
7 CaT1
8 CAT5
Run Code Online (Sandbox Code Playgroud)
我想说
gqlstring = "WHERE category = '{0}'".format('cat1')
returnvalue = Product.gql(gqlstring)
Run Code Online (Sandbox Code Playgroud)
并returnvalue
包含
id category
===================
1 cat1
3 Cat1
4 CAT1
7 CaT1
Run Code Online (Sandbox Code Playgroud) 我想为我的游戏实现互联网高分.并向他们所拥有的玩家提供反馈(不仅仅是top100或类似的东西).在普通的SQL中,它看起来像这样:
SELECT COUNT(*)FROM得分WHERE points>:newUsersPoints
和GQL有类似的东西
db.GqlQuery("SELECT*FROM Score WHERE points>:1",newUsersPoints).count()
但由于count()仅限于1000,因此在我的情况下它不会非常有用.您对如何实现这一点有任何想法吗?
我有两个
第一:
使用分片计数器的想法(http://code.google.com/intl/pl/appengine/articles/sharding_counters.html)创建新的"表格",用于存储某些范围内的分数(from_points,to_points)
汇总上表中range.to_points <newUsersPoints的所有计数器
在新分数为db.GqlQuery("SELECT*FROM Score WHERE points>:1 AND points> =:2 AND points <:3",newUsersPoints,range.from_points,range)的范围内查找分数大于分数的分数. to_points).count()+ sumfrom2
查找新分数所在的范围并增加其计数器
计数器的分割范围大于1000(或999),因此3.不会达到限制
在分数表中添加新分数
这是非常复杂和容易出错的.在添加分数之前,我们可能会增加一些范围和超时.(不是交易)
第二个想法:
有时候(每天一次?)按分数对所有分数进行排序并给它们新的位置(脚本可能超时,所以我们必须以块的形式进行)
要找出我们刚刚在哪个地方获得新分数
db.GqlQuery("SELECT*FROM Score WHERE points>:1 LIMIT 1",newUsersPoints).get().precalculated_position + 1
还有其他想法吗?
我正在尝试编写一个返回特定类型的N个随机记录的GQL查询.我当前的实现工作但需要N次调用数据存储区.如果可能的话,我想对数据存储区进行1次调用.
我目前为我放入数据存储区的每种类型分配一个随机数.当我查询随机记录时,我生成另一个随机数并查询记录> rand ORDER BY asc LIMIT 1.
这是有效的,但它只返回1条记录,所以我需要进行N次查询.关于如何进行这一查询的任何想法?谢谢.
如何编写一个查询,从数据存储中的10000个对象的集合中选择项目2000-2010.
我知道在GQL中可以这样做:
select * from MyObject limit 10 offset 2000
Run Code Online (Sandbox Code Playgroud)
根据文档,当使用offset
引擎时仍将获取所有行,只返回它们,从而使查询以与值的线性对应的方式执行offset
.
有没有更好的方法?例如使用伪ROWNUM
列可以在其他类型的数据存储中执行.