Google App Engine数据存储区查询语言(gql)不提供"LIKE"等不精确的运算符,甚至不区分大小写.通过存储字段的小写版本,可以解决区分大小写的问题.但是如果我想搜索一个人但我不确定这个名字的拼写怎么办?是否有可接受的处理此方案的模式?
阅读:http://code.google.com/appengine/docs/python/datastore/gqlreference.html
我想用:
:= IN
但我不确定如何使它工作.我们假设如下
class User(db.Model):
name = db.StringProperty()
class UniqueListOfSavedItems(db.Model):
str = db.StringPropery()
datesaved = db.DateTimeProperty()
class UserListOfSavedItems(db.Model):
name = db.ReferenceProperty(User, collection='user')
str = db.ReferenceProperty(UniqueListOfSavedItems, collection='itemlist')
Run Code Online (Sandbox Code Playgroud)
如何进行查询以获取用户保存的项目列表?显然我可以这样做:
q = db.Gql("SELECT * FROM UserListOfSavedItems WHERE name :=", user[0].name)
Run Code Online (Sandbox Code Playgroud)
但这给我一个关键列表.我现在想要获取该列表并将其放入查询中以从UniqueListOfSavedItems中获取str字段.我以为我能做到:
q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems WHERE := str in q")
Run Code Online (Sandbox Code Playgroud)
但是有些事情不对......任何想法?是(我在我的日常工作,所以现在不能测试):
q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems __key__ := str in q)
Run Code Online (Sandbox Code Playgroud)
旁注:要搜索的是一个非常难以解决的问题,因为我真正关心的是"IN"运算符.
我想检查一下电子邮件是否在Appengine的数据库中,如果没有:然后将其输入数据存储区.
我是python的新手. 为什么这个简单的代码不起作用?(如果有更好的方式/更有效的方式来写这个,请告诉我)
(我得到错误:BadArgumentError:未使用的位置参数[1])
class EmailAdd(webapp.RequestHandler):
def get(self):
query = db.GqlQuery("SELECT * FROM EmailDatabase WHERE emailaddress=':1'", self.request.get('emailaddress'))
result = query.get()
if result is None:
newemail = EmailDatabase()
newemail.emailaddress = self.request.get('emailaddress')
newemail.put()
Run Code Online (Sandbox Code Playgroud)
作为参考,这是我的db类:
class EmailDatabase(db.Model):
emailaddress = db.StringProperty()
date = db.DateTimeProperty(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud) 说我有2种:
class Account(db.Model):
name = db.StringProperty()
create_time = db.DataTimeProperty()
last_login = db.DateTimeProperty()
last_update = db.DataTimeProperty()
class Relationship(db.Model)
owner = db.ReferenceProperty(Account)
target = db.ReferenceProperty(Account)
type = db.IntegerProperty()
Run Code Online (Sandbox Code Playgroud)
我想得到以下查询的等价:
SELECT target
FROM Relationship
WHERE owner = :key AND type = :type
ORDERBY target.last_login DESC
Run Code Online (Sandbox Code Playgroud)
怎么做?
参考:http://www.mail-archive.com/google-appengine@googlegroups.com/msg15878.html
是否可以从谷歌应用引擎数据库中选择db.Model对象的键不在给定列表中?如果是这样,语法是什么?
模型类的例外:
class Spam(db.Model):
field1 = db.BooleanProperty(default=false)
field2 = db.IntegerProperty()
Run Code Online (Sandbox Code Playgroud)
我想要工作但无法弄清楚的查询示例:
spam_results = db.GqlQuery(
"SELECT * FROM Spam WHERE key NOT IN :1 LIMIT 10",
['ag1waWNreXByZXNlbnRzchMLEgxBbm5vdW5jZW1lbnQYjAEM',
'ag1waWNreXByZXNlbnRzchMLEgxBbm5vdW5jZW1lbnQYjgEM'])
for eggs in spam_results:
print "id: %s" % a.key().id()
Run Code Online (Sandbox Code Playgroud) 这是我的gql代码:
data = db.GqlQuery("SELECT * FROM Playlist " + "WHERE tags = :1" + "ORDER BY :2", tag, order)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
BadQueryError:Parse Error:符号BY上没有其他符号
有谁知道我做错了什么?
谢谢你的帮助
我在我的Google App Engine应用程序中创建了一个表单,供用户从列表中选择项目,然后将从名为Item的数据存储表中提取其中的具体详细信息(例如名称,其他属性),并在表格中显示用户提交表单.
我有一个Python列表,其中包含从表单中提取的所选条目的键.我想使用此列表查找数据存储区中的条目,并以我可以传递给Django模板的方式返回它们.
我试图在这个论坛上遵循建议使用GQL查询,但到目前为止我得到的都是空结果,无论是使用fetch(),硬编码键值,尝试使用WHERE Key IN :list或的一些变体WHERE Key = :variable.
如果您需要代码,请告诉我哪些部分会有所帮助.
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应该"更快",因为它不需要被正确翻译?
我正在Google App Engine上开发一个应用程序(Windows上的SDK版本1.7.0),我需要经常测试,此测试涉及数据存储区上的大量GQL查询.
您可以在App Engine的管理界面中在浏览器中运行GQL查询:

但是在localhost上的SDK管理控制台上似乎无法实现这一点.没有这样的选择:

所以我似乎只能通过我的localhost上的python脚本运行GQL查询.
每次编写一个python脚本来查询短任务的结果并不方便.此外,如果您在在线管理界面上执行此操作,您可以在下面的一个很好的表格中立即看到查询结果.如果你想通过python脚本在浏览器窗口中可视化所有查询结果,你必须编写更多代码,基本上试图重写谷歌已经在他们的服务器管理界面上做得很好.
因此,我不得不在部署后在App Engine管理界面上的浏览器上执行此操作,这会不断添加到我允许的操作计数,直到我很快达到每日免费配额限制.
那么有没有办法在我的localhost上运行GQL查询(非编程,在浏览器上)?
我是使用Google App Engine开发Web应用程序的新手.
我想检查数据存储区中为list属性(db.ListProperty)设置空值的实体.但是,当我尝试检查任何针对entity.listGAE的内容时都会出现错误:
'super' object has no attribute 'list'.
在一些搜索之后,我在这个SO问题中看到,为GAE数据存储区实体的列表属性设置空值等同于根本不设置该属性.这解释了我的错误.
所以我需要匹配数据存储区中根本没有任何list属性集的实体.查看GAE文档,我仍然没有找到任何允许我检查实体是否具有特定属性集的方法.
注意:我不必使用GQL执行此操作.我可以用GQL检索所有实体,然后用python检查.但是GQL解决方案也没问题.
python database google-app-engine gql google-cloud-datastore