[跟康爷学GAE]存储用户的留言(附GAE数据结构的介绍)
《跟康爷学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中的)
本节不提供代码了,大家自行修改上一节的代码,有问题问~
GAE数据库提供数据的删除和修改操作吗?怎么好像都没有这方面的说明?
提供的。。。。修改和新增一样的。。put()
删除是greeting.delete()
具体可以查一下类库
不知为什么,我的那个扩展dbModel的class里明明有个名字为tag的StringList属性,但是在google的dashboard里面看到数据上就是没有