【问题标题】:Selecting based on __key__ (a unique identifier) in google appengine在 google appengine 中基于 __key__ (唯一标识符)进行选择
【发布时间】:2023-03-14 04:25:02
【问题描述】:

我又来了

""" 网站消息 """ 类消息(db.Model): # from/to/ 其他几个字段 主题 = db.StringProperty() 正文 = db.Text() 发送 = db.DateTimeProperty( auto_now_add=True )

现在我正试图通过它的 KEY 来挑选一条消息。我早些时候保存了密钥并将其植入 HTML 表单中。结果是一个可点击的链接,看起来像

点击打开

然后我运行这个 GQL 查询:

gql = """select * from Message where __key__='aght52oobW1hZHIOCxIHTWVzc2FnZRiyAQw'"""

但它不起作用,因为

BadFilterError:BadFilterError:无效过滤器:__key__过滤器值必须是Key;收到 aght52oobW1hZHIOCxIHTWVzc2FnZRiyaAQw (a str)。

我在这里完全遗漏了一些东西,那就是 你如何将 object 放入 GQL 查询字符串中......并且没有 Gql 解析器抱怨它是一个字符串?

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

    不必为基于键的检索使用 GQL —— 从字符串中创建一个键对象:

    k = db.Key('aght52oobW1hZHIOCxIHTWVzc2FnZRiyAQw')
    

    只是db.get(k)。如果您坚持使用 GQL,顺便说一句,k——db.Key 的适当构造实例,不是字符串对象!-)——也是您需要替换到 GQL 查询中的内容(:1 或其他人)。

    【讨论】:

    • 哦!这将永远有效吗?所以键不仅在表中是唯一的,而且在我的整个 web 应用程序中也是唯一的?所有时间的所有网络应用程序?
    • @'bo'*4,键是非常唯一的——从一个键中你可以得到实体的.app()(所以跨应用程序的唯一性是给定的),.kind()(所以在应用程序也没有问题)等。
    • 另外值得注意的是,.get 的时间大约是查询时间的三分之一。
    • @Nick,是的,我应该提到这具有速度和简单的优势。
    • 你知道如何在 Java 版本中做同样的事情吗?没有数据库类:(
    【解决方案2】:

    您也可以通过构造“an entity key literal, with...a complete path of kinds and key names/IDs”来手动构造查询。

    SELECT * FROM Message WHERE __key__ = KEY('Message', 'message_key')
    

    如果您使用的是 Datastore Viewer/Explorer 并且无法使用 Python 语法,这将更加有用。

    【讨论】:

      猜你喜欢
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 2012-01-06
      相关资源
      最近更新 更多