首页 > 教程 > [跟康爷学GAE]存储用户的留言(附GAE数据结构的介绍)

[跟康爷学GAE]存储用户的留言(附GAE数据结构的介绍)

2009年7月26日 康爷 发表评论 阅读评论

跟康爷学GAE》是整个Google App Engine教程计划的一个总名称,如果你对这个系列的GAE教程感兴趣,可以订阅康爷的博客。整个教程的目录在:GAE教程计划的目录,教程会同步发送到gae.kangye.org上面。

如果你有什么问题或者建议,欢迎在twitter上follow我,然后给我回复或者direct message。我的twitter账号是:lookon,如果你无法访问twitter,建议你使用http://twitzap.com/

 

上次我们说到如何用Google App Engine实现表单,以及在后台(即server端)获取表单数据(

[跟康爷学GAE]访客留言的Form和表单获取)。在本节中,我将教你如何使用GAE的datastore存储用户在我们这个测试网站上的留言。

首先,要明确,GAE使用的是datastore,这是一个bigtable结构(Google关于BigTable的介绍)。在Google工程师的一个视频中提到,GAE的这种数据结构,在读取数据的时候速度很快很快(因为本身是一个大hash表),但在写数据的时候速度就慢,大约是慢1/10,所以要多利用read,合理设计你的数据字段,快速获取。

在GAE的实践中,我们很容易发现如下一些问题:

1.GAE的数据没有id

2.GAE的数据不易于分页

3.GAE的数据获取相当快

4.GAE的数据字段设计相当重要,但又和平时一般的数据字段设计不同

5.the last but not least:GAE没有数据库

我也是在边学习边实践,以上是我的一些感觉,关于如何实现分页,Google官方写了一篇Article,链接如下:

Paging through large datasets

 

下面来简单实现一下如何用GAE存储数据。

就像一把双刃剑,GAE的方便也在于不用考虑数据库,直接从db.model继承一个类,就可以使用了。下面我们创建一个Greeting类来存储数据:

class Greeting(db.Model):  author = db.UserProperty()  content = db.StringProperty(multiline=True)  date = db.DateTimeProperty(auto_now_add=True)

 

GAE目前支持的类型很多,字符型,整型,布尔型等等,具体在这里:Types and Property Classes(你可以自己换成中文看)。

multiline=True的意思是,可以有多行;auto_now_add=True说明,缺省情况下,每一个实例创建的时间将会被添加到date字段。另一个属性是,auto_now,这个和auto_now_add不同,是数据实例最后一次被修改的时间。(你可以自己玩玩,然后输出出来看看)

上一节我们用self.request.get(‘content’)来获取用户留言的内容,那么现在我们要将他们存到datastore里去。很简单,首先创建一个Greeting实例:

greeting = Greeting()

然后将content里的内容赋值给greeting的content字段:

greeting.content = self.request.get('content')

那user字段呢?也很容易

if users.get_current_user():      greeting.author = users.get_current_user()

 

就是说,如果用户登录了,那么将greeting的author设成当前登录用户。

当字段都填完之后(注意,date可以不用填,因为它可以默认为实例创建时间),我们将greeting存入datastore中:

greeting.put()

课后作业

大家在回复中大多谈到自己要如何修改一些教程里的东西,个么我觉得习题还是很有提示作用的,我每次着重布置些题目,供大家练习:

1.修改Greeting的字段(添加整形,布尔型,Blog型)

2.重新设计form,配合新增的字段(1中的)

 

本节不提供代码了,大家自行修改上一节的代码,有问题问~

分类: 教程 标签:
  1. smallworld
    2009年8月22日15:32 | #1

    GAE数据库提供数据的删除和修改操作吗?怎么好像都没有这方面的说明?

  2. 康爷
    2009年8月22日16:15 | #2

    提供的。。。。修改和新增一样的。。put()
    删除是greeting.delete()
    具体可以查一下类库

  3. 2009年9月16日00:12 | #3

    不知为什么,我的那个扩展dbModel的class里明明有个名字为tag的StringList属性,但是在google的dashboard里面看到数据上就是没有

  1. 本文目前尚无任何 trackbacks 和 pingbacks.