【问题标题】:Query to database with 'primary key' on GoogleAppEngine?在 GoogleAppEngine 上使用“主键”查询数据库?
【发布时间】:2011-02-23 00:26:10
【问题描述】:

我使用 Google App Engine(GAE):python 制作了一个留言簿应用程序,并且客户端在 iPhone 上运行。

它可以用昵称在板上写消息。
该实体有 3 个字段:

  1. 昵称
  2. 日期
  3. 留言

而且我即将创建另一个功能,用户可以在消息上发布回复(或评论)。

但要做到这一点,我认为留言簿实体应该有一个“主键”,所以我可以将一些关于回复的信息放在消息中。

有了这三个字段,我不能只从数据库中获取一条消息。

我是数据库新手。数据库会自动保存某种索引吗?还是必须由用户完成?

如果它是由数据库本身(或不是)自动完成的,我怎样才能得到一个带有密钥的实体??

我也想获得一些关于如何制作回复功能的建议。感谢阅读。

【问题讨论】:

    标签: iphone google-app-engine gql


    【解决方案1】:

    每个实体都有一个键。如果您在创建实体时未分配 key_name,则部分键是自动分配的数字 ID。除非您另外指定,否则长文本字段以外的属性会自动编入索引。

    如果您知道密钥,要获取实体,您只需执行db.get(key)。对于回复,您可能希望在回复实体中使用db.ReferenceProperty 来指向父消息;这将自动在消息中创建一个反向引用查询以获取回复。

    【讨论】:

    • 感谢我正在寻找的正确答案!我搜索了 ReferenceProperty,this 很好地解释了建模,它也有很好的例子。我想我现在可以努力了。再次感谢你。 ;)
    【解决方案2】:

    每个实体都有一个键,它包含诸如实体类型、命名空间、父实体以及最重要的唯一标识符(用户可指定)等信息。

    您可以使用所有实体都有的key 方法获取实体的密钥。

    message.key()
    

    密钥可以与 URL 安全字符串相互转换。

    message_key = str(message.key())
    message = Message.get(message_key)
    

    如果密钥具有用户指定的唯一标识符(密钥名称),您可以这样访问它

    message.key().name()
    

    或者,如果没有指定键名,则会自动分配一个 id。

    message.key().id()
    

    要为实体分配键名,必须在创建实体时指定,之后无法添加/删除或更改键名。

    message = Message(key_name='someusefulstring', content='etc')
    message.put()
    

    然后您将能够使用密钥名称从数据存储中获取消息

    message = Message.get_by_key_name('someusefulstring')
    

    使用 db.ReferenceProperty 存储对另一个实体的引用(可以是任何类型)

    尽可能使用键名是个好主意,因为使用它们从数据存储中获取数据要快得多,因为它不涉及查询。

    【讨论】:

    • 感谢关于key的详细解答!并且还暗示了 ReferenceProperty!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多