conta's diary

思ったこと、やったことを書いてます。 twitter: @conta_

python de google spreadsheetをDB化

DBをspreadsheetで管理したらイケメンになれる!かもしれないので、やってみました。
spreadsheetをイジイジする方法は何パターンかあるのですが、
google先生が提供している
gdata.spreadsheet.text_db
というモジュールが良さげな感じだったので一通り試してみました。

実行環境

pc: mac osx lion
python: 2.5.6

必要なもの

gdata-python-client
http://code.google.com/p/gdata-python-client/
をインストールしてください。

使い方

今回はtext_dbというモジュールを使います。
スプレッドシートをDBっぽく使えます。

接続

こんな感じです。

username = os.environ['GMAIL_ADDR']
passwd = os.environ['GMAIL_PASS']
databasename = "testdb"
tablename = 'testtable'
    
try:
    # connect
    client = gdata.spreadsheet.text_db.DatabaseClient(username, passwd)
except Exception, e:
    print repr(e)

あらかじめIDとPassはシェルでexportしております。

もしWebからIDとPASSを取得して接続したかったらこんな感じらしい。
なるほどねー (AuthSubは以前の記事を参照)
*ココ参照 http://stackoverflow.com/questions/870192/authsub-with-text-db-in-google-app-engine
:TODO 未確認コード

auth_url = client._GetDocsClient().GenerateAuthSubURL(
        next_url,
        scope='http://spreadsheets.google.com/feeds/ http://docs.google.com/feeds/documents/', 
        secure=False,
        session=True)

データベースの取得、作成

こんな感じ。

 if client.GetDatabases(name=databasename) == []:
        logging.debug('not exists db, create ')
        client.CreateDatabase(databasename)
db = client.GetDatabases(name=databasename)[0]

GetDatabasesで返ってくるのはリストだから、[0]をつけて先頭のものをとってきている。
噂によると、データベースの名前を前方一致で取得してくるらしいので
test
testA
っていうDBがあったら[testのDB, testAのDB]みたいな感じで返ってくる、らしい(未確認)

テーブルの作成、取得

#適当に設定
keys = ('id', 'name', 'price')

if db.GetTables(name=tablename) == []:
      logging.debug('create table')
      db.CreateTable(tablename, [key for key in keys])
#取得
tbl = db.GetTables(name=tablename)[0]

#便利機能?(別に必要ありません)
tbl.LookupFields()
print tbl.fields

これも先ほどのDBと同じ感じ。

便利機能?って書いてあるのは、
ライブラリを読んでて、見つけたものです。
LookupFields()
を実行するとプロパティのfieldsというところに
フィールド名がリストで入る。
これを実行しておくと、データ取得の際にキーをわざわざ書かなくてもいい感じになりそうです。
(まぁ、取得したデータの1行目を見れば分かるんですけどね)

挿入

rec = dict(id = 'cat', name = u'いいq', price = str(400))
tbl.AddRecord(rec)

これで挿入できます。
ブラウザでSpreadsheetを確認すると”入ってるー!”ってなります。
日本語を使うときは、
# -*- coding: utf-8 -*-
を忘れずに。

レコードの取得

tbl = db.GetTables(name=tablename)[0]
records = tbl.GetRecords(start_row=1,end_row=1)
    
for record in records:
    print record.content

Recordクラスのcontentにデータが入っているので、
これをイジイジしてあげるといいです。
実行すると、
{'price': '400', 'id': 'cat', 'name': u'\u3042'}
と出力されます。

終わりに

ブラウザを開いているとDBとがリアルタイムで更新されるので、
すげぇぇ、ちょーたのしーっ!って気分になれます。

日本語の情報はほとんどありませんね^^;
結局使い方はPyDocとライブラリのソースコードを読むのが早そう。。。
text_dbは
gdata.spreadsheet.service
gdata.docs.service
らへんのモジュールをラップしてる感じなので、
Google SpreadSheet API
http://code.google.com/apis/spreadsheets/data/1.0/developers_guide_python.html
とあわせて読むと使い方がだいたい分かりそうな気がします。


おしまい(・∀・)