print textSample.content
儲存True或是False的資料型態
import datetime
from google.appengine.ext import db
class BooleanSample(db.Model):
enabled=db.BooleanProperty(required=True,default=False)
booleanSample=BooleanSample()
booleanSample.put()
print booleanSample.enabled
booleanSample.enabled=True
booleanSample.put()
print booleanSample.enabled
儲存整數型態的資料
import datetime
from google.appengine.ext import db
class Sample(db.Model):
value=db.IntegerProperty(required=True,default=0)
sample=Sample(value=123)
sample.put()
print sample.value
儲存浮點數資料型態
import datetime
from google.appengine.ext import db
class Sample(db.Model):
value=db.FloatProperty(required=True,default=0.0)
sample=Sample(value=123.456)
sample.put()
print sample.value
- DateTimeProperty、DateProperty、TimeProperty
用來儲存日期及時間資料型態的資料,需要使用python中的datetime.datetime、datetime.date或是datetime.time物件。
其選項
- auto_now_add:可為True或False,來設定物件實體產生時,是否會自動寫入目前的日期或時間。
- auto_now:可為True或False,來設定物件實體更新時,是否會自動寫入目前的日期或時間。
import datetime
from google.appengine.ext import db
import datetime
class Sample(db.Model):
setDay=db.DateProperty()
created=db.DateTimeProperty(auto_now_add=True)
updated=db.DateTimeProperty(auto_now=True)
sample=Sample()
sample.setDay=datetime.date(2014,7,5)
sample.put()
print sample.key(),sample.setDay,sample.created,sample.updated
getSample=db.get(sample.key())
getSample.setDay=datetime.date(2009,1,1)
getSample.put()
print getSample.key(),getSample.setDay,getSample.created,getSample.updated
- ListProperty、StringListProperty
可以用來儲存list的資料型態,在ListProperty 中可放入要存放list內元素的資料型態,StringListProperty則無此選項。
import datetime
from google.appengine.ext import db
import datetime
class Sample(db.Model):
order=db.ListProperty(int)
tags=db.StringListProperty()
sample=Sample()
sample.order=[1,2,4,5,7,2]
sample.tags=[u'item',u'bar',u'data']
sample.put()
print sample.order,sample.tags
- ReferenceProperty、SelfReferenceProperty
用來指向其它資料實體的資料欄位,儲存資料的資料型態為db.Key物件,可以使用這個欄位來作出各實體物件間的關聯。其選項:
- reference_class:為參考資料實體的資料模型
- collection_name:在參考資料模型中建立的list資料欄位名稱,若不指定則會使用"模型名稱_set"來作為資料欄位名稱。
import datetime
from google.appengine.ext import db
class User(db.Model):
name=db.StringProperty()
class Article(db.Model):
author=db.ReferenceProperty(reference_class=User)
title=db.StringProperty()
content=db.TextProperty()
u=User(name='Eric')
u.put()
article1=Article(author=u,title='title1',content='content1')
article1.put()
article2=Article(author=u,title='title2',content='content2')
article2.put()
article3=Article(author=u,title='title3',content='content3')
article3.put()
print article1.author.name
user=db.get('ahJkZXZ-Z2Fld2VhdGhlcnJpc2tyEQsSBFVzZXIYgICAgIDkmQkM')
print user.name
for article in u.article_set:
print 'Article: %s'%article.title
但若有兩個資料欄位都要參考到同一個資料模型時,就會發生錯誤。
class Article(db.Model):
author=db.ReferenceProperty(reference_class=User)
reviewer=db.ReferenceProperty(reference_class=User)
就必須要設定不同的collection_name
import datetime
from google.appengine.ext import db
class User(db.Model):
name=db.StringProperty()
class Article(db.Model):
author=db.ReferenceProperty(reference_class=User,collection_name='writings')
reviewer=db.ReferenceProperty(reference_class=User,collection_name='reviews')
title=db.StringProperty()
content=db.TextProperty()
'''
u1=User(name='Eric1')
u1.put()
u2=User(name='Eric2')
u2.put()
article1=Article(author=u1,reviewer=u1,title='title1',content='content1')
article1.put()
article2=Article(author=u2,reviewer=u1,title='title2',content='content2')
article2.put()
article3=Article(author=u1,reviewer=u2,title='title3',content='content3')
article3.put()
article4=Article(author=u2,reviewer=u2,title='title4',content='content4')
article4.put()
'''
u=db.get('ahJkZXZ-Z2Fld2VhdGhlcnJpc2tyEQsSBFVzZXIYgICAgIDUkQgM')
print dir(u.writings.order)
for article in u.writings.order('title'):
print article.title
========================================================
如果要參考到相同的資料模型,可以使用SelfReferenceProperty,並用collection_name來設定欄位名稱。
class User(db.Model):
name=db.StringProperty()
employer=db.SelfReferenceProperty(collection_name='employees')
當資料儲存之後,GAE會配給每一個資料實體一個Key值(是經過加密的),這個值內容包含資料種類及ID,另外您也可以自己命名一個獨一無二的鍵值名稱key_name。ID值則是系統自動配發的數字。
由上述的例子我們可以得知,資料的儲存可以利用put( )的方法,資料的取得可以利用db.get( )的方法,其中必須加入資料實體的key值:
#u_key 為某個資料實體的key值
db.get(u_key)
同樣的,資料實體的刪除,我們可以利用db.delete( )的方法
#u_key 為某個資料實體的key值
db.delete(u_key)
資料的操作
資料實體entity的建立作法,是必須要先定義資料模型的類別,然後再去產生資料物件。產生資料物件的方法有二:
import datetime
from google.appengine.ext import db
class Sample(db.Model):
value=db.IntegerProperty(default=0)
sample=Sample(value=123)
sample.put()
print sample.value
import datetime
from google.appengine.ext import db
class Sample(db.Model):
value=db.IntegerProperty(default=0)
sample=Sample()
sample.value=456
sample.put()
print sample.value
資料的儲存可以利用物件類別put( )的方法或是透過db.put( )的方法
import datetime
from google.appengine.ext import db
class Sample(db.Model):
value=db.IntegerProperty(default=0)
sample=Sample()
sample.value=777
db.put(sample)
print sample.value
透過Query物件來取得資料實體
我們可以透過資料模型的all( )方法取得一個Query物件,然後利用fetch(limit,offset)的方法來取得我們所要的資料。
from google.appengine.ext import db
class User(db.Model):
name=db.StringProperty()
class Article(db.Model):
author=db.ReferenceProperty(reference_class=User)
title=db.StringProperty()
content=db.TextProperty()
query=Article.all()
articles=query.fetch(2,0)
for article in articles:
print article.title
我們可以利用filter( )方法來比對我們想要的資料
query=Article.all()
query.filter('title =','title1')
articles=query.fetch(2,0)
for article in articles:
print article.title
==============
query=Article.all()
query.filter('title >','title1')
articles=query.fetch(2,0)
for article in articles:
print article.title
我們可以利用order( )方法來排序資料
query=Article.all()
query.order('title')
articles=query.fetch(3,0)
for article in articles:
print article.title
或是order內的參數加減號(- )取得相反順序的排序資料。