使用Google App Engine上的“主键”查询数据库?

时间:2011-02-23 00:26:11

标签: iphone google-app-engine gql

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

它有能力用昵称在电路板上写信息 该实体有3个文件:

  1. 昵称
  2. 日期
  3. 消息
  4. 我即将发布另一项功能,即用户可以在邮件上发布回复(或评论)。

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

    通过这三个字段,我无法从数据库中获取一条消息。

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

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

    我想知道一般如何制作回复功能。感谢阅读。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

您可以使用所有实体拥有的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存储对另一个实体的引用(可以是任何类型)

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