搬出 App Engine

昨天把 MyAudioCast 搬出了 App Engine, 花了一些時間改寫程式跟 migrate 資料, 最後搬到了 Linode 上。 而原本在 App Engine 上用的是 Django 1.1, 順便也把 Django 升到 1.3。

在這次搬家的過程花最多時間的就是在處理資料的轉換了, 而最初我以為要把資料從 App Engine 倒出來非常麻煩, 不過後來找到倒出資料的文件, 就照著文件說明把資料倒出成 csv, 然後寫了幾支 Django command 讀取 csv 寫進資料庫。

首先第一步就是建立 mapping 的 config 檔, 只需要下面這個指令就可以產生 datastore mapping 的 yaml。

appcfg.py create_bulkloader_config --filename=bulkloader.yaml .  

接著編輯這個文件, 找到 TODO 然後把 Foreignkey 都填上, connector 就填 csv, 然後就可以透過這份 yaml 執行下面這個指令來把資料倒成 csv 了。

appcfg.py download_data --config_file=bulkloader.yaml --filename=users.csv --kind=User .  

這樣一來需要的就只是讀取 csv 然後寫進 database 了, example script 像是下面這樣。

from django.contrib.auth.models import User import csv

items = csv.DictReader(open('/home/tzangms/users.csv', 'rb'))  
for item in items: user = User()  
    user.username = item['username']
    user.email = item['email'] user.save()

    # other steps
    # ...

基本上, 只要依照以上的步驟就可以把資料都倒出來了, 當初還沒想到有這麼簡單的方法。 不過後來其實在 migrate 資料時就碰到了一些頭痛的問題。

資料關聯的問題

即使資料可以倒出成 csv, 在匯入資料時就碰到問題了, 因為如果 datastore 的 entity 指定了 parent 的話, key id 就可能會重覆, 像是 myaudiocast 的 Episode 的 parent 是指為 Podcast, 所以幾乎每個 podcast 的第一集節目的 key id 都是 1001, 所以當初有 800 多個 episode 的 key id 都是 1001。

本來想說應該用 podcast 的 key id 可以用來區分不同 podcast 的 episode, 不過 Podcast 先前的 parent 也是設成 User, 所以也是重覆的, 有八百多個 1 吧 XD

幸好當初 Episode 同時存了 User 跟 Podcast 當 ForeignKey, 所幸還有 User 的值可以用 (內容就是 email), 不然還真的沒辦法。

其實我後來發現, 你也可以把很多東西預先寫起來在 dump 出來, 如果當任何東西都沒辦法作關聯的話, 至少把這個 entity 的網址給存下來, 之後再 parse 吧!

帳號登入的問題

由於先前 myaudiocast 直接用 google account 登入, 所以搬出來只好實作一下 Google OAuth 2, 不過當初資料超少的, 我連 API Console 都找不到, hmm … 我想當初應該還是在實驗階段吧。

Anyway, 因為 Federated Login 有點麻煩, 所以就選了跟 OAuth 2 來做, 實作起來簡單多了。

因為倒出來的帳號資料跟 Google 有關連的就只有 email, 所以要用 Google OAuth 2 的話, 至少也要拿到 email 才行, 可是翻來翻去根本找不到 OAuth 2 的 scope, 不過目前文件好多了 …

用下面這兩個 scope 應該就夠了, 當初找一整天都沒找到 …

https://www.googleapis.com/auth/userinfo.profile  
https://www.googleapis.com/auth/userinfo.email  

看過 Facebook 的 scope 就覺得… Google 你未免也太囉嗦了 XD

原本的網址失效

因為 key id 的問題, 導致沒辦法直接用原本的 key id, 從 DataStore 轉進 SQL 的話, 原本的網址也就失效了。 不過這個解決的方法很簡單, 另外存一份原本的 key id 就好了, 當找不到 episode 時, 改用 key id 找看看, 沒有的話再秀 404, 目前看來狀況良好。

掰掰了 App Engine

這個月每天都在 App Engine 上花了大約 4 ~ 5 塊美金, 這樣下來一個月就要花上大約 150 塊, 真的是滿貴的。可是其實就用量來看, 搬到一台 Linode 512 都還可以撐, 一個月只需要 20 塊, 而且效能還比以往好上許多。 當然也許這可能就是 scalable 跟不用管機器的代價吧? XD

突然想到大約半年前還在 beta 的 App Engine, 常常 deploy 都要花上 5 ~ 10 分鐘才完成, 時間的花費真的是不值得, 雖然現在狀況好上很多, 不過價錢卻不是我付得起的, 甚至根本無 C/P 值可言, 我想也只能說掰掰了。

不過還是學到挺多東西的就是, 掰掰了 App Engine。

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!