GQL查询(GAE数据存储区Python):如何检索具有相同标记的所有实体以及包含子字符串的所有实体?

时间:2012-10-09 20:41:31

标签: python google-cloud-datastore gql

我有一个存储在GAE中的60000对双语词典数据库,如下所示:

日期,标签,价值

日期,可见,螺丝

日期,vis,螺丝

date,visàbois,wood screw

日期,相对于指尖,锥形螺钉

date,visàbraser,braze screw

date,visàmétaux,machine screw

今天使用以下python脚本:

def get_value(self, tag):
  entry = db.GqlQuery("SELECT * FROM StoredData where tag = :1", tag).get()
  value = entry.value
  value = unicode(value)
  value = value.encode('ascii','xmlcharrefreplace')

如果我要求“相对”,我只会回复“搞砸”。

问题:

  1. 我想把“螺丝”作为第二个答案,也就是说检索所有具有相同标签的实体。

  2. 我想得到包含子串“screw”的所有实体(用户输入的最少3个字符):

  3. 螺钉,螺钉,木螺钉,锥形螺钉,铜焊螺钉,机械螺钉

    =>我要用什么GQL查询在这个脚本生成的表中显示它们?

    ### Show the tags and values as a table.
    ###def show_stored_data(self):
    ###  self.response.out.write('''
    ###    <p><table border=1>
    ###      <tr>
    ###         <th>Key</th>
    ###         <th>Value</th>
    ###         <th>Created (GMT)</th>
    ###      </tr>''')
    ###  entries = db.GqlQuery("          ***GQL query n°1 or n°2***           ")
    ###  for e in entries:
    ###    entry_key_string = str(e.key())
    ###    self.response.out.write('<tr>')
    ###    self.response.out.write('<td>%s</td>' % e.tag)
    ###    self.response.out.write('<td>%s</td>' % e.value)
    ###    self.response.out.write('<td><font size="-1">%s</font></td>\n' % e.date.ctime())
    ###    self.response.out.write('''
    ###      <td><form action="/deleteentry" method="post"
    ###            enctype=application/x-www-form-urlencoded>
    ###     <input type="hidden" name="entry_key_string" value="%s">
    ###     <input type="hidden" name="tag" value="%s">
    ###            <input type="hidden" name="fmt" value="html">
    ###     <input type="submit" style="background-color: red" value="Delete"></form></td>\n''' %
    ###                            (entry_key_string, e.tag))
    ###    self.response.out.write('</tr>')
    ###  self.response.out.write('</table>')
    

    非常感谢您的帮助。

    菲利普

2 个答案:

答案 0 :(得分:0)

只获得一个结果

Here是您的问题 - 您在.get()对象上使用GqlQuery方法。文档说:

  

调用查询的get()方法,以获取数据存储区中找到的第一个匹配实体:

如果你这样做:

def get_value(self, tag):
  entries = db.GqlQuery("SELECT * FROM StoredData where tag = :1", tag).get()
  for entry in entries:
    value = entry.value
    value = unicode(value)
    value = value.encode('ascii','xmlcharrefreplace')
    print value

我希望你会看到你同时获得screwscrews

子串

至于用"screw"获取所有字符串,这将比你讨价还价要困难得多。看看this SO question。有些答案建议您使用SearchableModel

对于vis à <blank>这样的示例,如果您知道该词组始终以相关的子标签开头,您可以使用><来获取您的内容正在寻找,也许看看标签是否在visvis zzzzzzz之间,或者沿着这些方向 - 我不是100%清楚GQL的字符串排序顺序,我找不到现在的文件。

答案 1 :(得分:0)