GAE 的資料庫跟一般 RDBMS 不同, 想簡單點就是 Key-Value base 的 DB, 所以操作起來會有些地方需要注意.
不過此篇主要只寫各種基本資料操作的方式, 其它進階的不列入此篇.
DB datastore 資料操作
Data Store 完整範例
from google.appengine.ext import db# put - 設定資料 (儲存資料)
pet = Pet(
name = 'Kitty',
category = db.Category('cat'),
owner = users.get_current_user()
)# 取得資料, 修改
pet = db.get(some_pet_key_name)
pet.name = 'Tsung' # 修改值# 寫入 DB
pet.put() # 或 db.put(pet)
下述只寫部份程式, 與上述完整範例套用即可.
Query 抓取 datastore 的資料
- 從 第20筆 開始 取10筆
query = Message.all()
msgs = query.fetch(20, 10) - 取出名字是 abc, 從 第20筆 開始 取10筆
query = Message.all()
query.filter("name = ", "abc") # 另外有 <, <= =, >=, !=, IN 可以用.
msgs = query.fetch(20, 10) - 取出名字是 ab 開頭的字串
query = Message.all()
query.filter('name >= ', 'ab')
query.filter('name < ', u'ab' + u'\ufffd') # u'\ufffd 代表最大的 unicode 字元. - 排序
query = Message.all()
query.order('created') # query.order('-created'), 反向排序
使用 GQL 取得資料
query = db.GqlQuery("SELECT * FROM Message WHERE name = 'abc' ORDER BY created")
query = db.GqlQuery("SELECT * FROM Message WHERE name = :1 ORDER BY created", "abc")
query = db.GqlQuery("SELECT * FROM Message WHERE name = :name ORDER BY created", name = "abc")
query = Message.gql("WHERE name = :name ORDER BY created", name = "abc")# 上述完成後都可搭配 msgs = query.fetch(20, 10), 若要於 GQL 直接設 LIMIT, OFFSET 如下:
query = Message.gql("WHERE name = :name ORDER BY created LIMIT 20 OFFSET 10", name = "abc")# msg_keys
msg_keys = db.Query(Message, keys_only = True)
msg_keys = db.GqlQuery('SELECT __key__ FROM Message')
使用物件操作資料的範例
visits = model.Visit.all()
visits.filter('hash = ', hash)
visits.order('-created')
visits = visits.fetch(int(limit), 0)# 挑其一使用
visits = db.GqlQuery("SELECT * FROM Visit")
# visits = db.GqlQuery("SELECT * FROM Visit WHERE hash = :1 ORDER BY created", hash)
# visits = db.GqlQuery("SELECT * FROM Visit WHERE hash = :1 ORDER BY created DESC LIMIT 20 OFFSET 0", hash)
# visits = model.Visit.gql("WHERE hash = :1 ORDER BY created", hash)# 將資料印出來
for msg in visits:
self.response.out.write('<b>%s</b> wrote:<br>' % msg.hash)
self.response.out.write('<b>%s</b> wrote:<br>' % msg.created)
直接存取 Data Store 的 Key, Value
這些資料在 DB 裡面儲存都是 key, value 的型式, 如果要直接使用 key 取得資料, 可用下述方式:
- 讀取
key = data.key()
the_data = db.get(key) - 寫入
data = Data(key_name = 'abc')
data.put() - 讀取 key_name 可於上述寫入時指定
the_data = db.get_by_key_name('abc') # 或 Data.get_by_key_name('abc') - 刪除
the_data = db.get_by_key_name('abc')
db.delete(the_data) # 或 the_data.delete() - 刪除多筆資料
query = Messages.all()
query.filter('name = ', 'abc')
msgs = query.fetch(10, 10)
db.delete(msgs)
設定資料群組(parent)
設定資料群組可以讓查詢比較快.
語法: from_path(parent 的資料種類名稱, parent 實體 key 名稱)
ex:
pet = Pet.get_by_key_name('abc', parent = db.Key.from_path('User', 'xxx@example.com')
blog = db.get(blog_key)
post = Post(parent = blog, title = title, content = content)