Google App Engine 初學(7) - Db Data Store 操作 (GQL)

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)


關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming。將永久鏈結加入書籤。

Google App Engine 初學(7) - Db Data Store 操作 (GQL) 有 2 則回應

  1. M&M 說道:

    站長您好 小弟在這研讀後 有一個問題
    http://blog.ericsk.org/archives/1073
    這裡有提到設為entity group後
    使用GQL來抓取就沒有entity group的效果了
    那麼 請問 小弟要抓取 parent='blog1' 的所有文章
    應該要怎麼下指令?
    小弟目前只想的出來用GQL的抓法 🙁

  2. Tsung 說道:

    所有文章, 我的抓法也是全部拉出來, 再一篇一篇拉耶. Orz..

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料