忍者ブログ
MASTER →  ADMIN / NEW ENTRY / COMMENT
現代魔法(nearly equal 情報技術)を勉強中な人のメモ(チラシの裏)
/ 2024/11/22 (Fri) / 編集
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

/ 2010/06/12 (Sat) / 編集
さきほどに引き続き、今度はログを保存するためのデータベース作成編。とはいえ全部書くと長ったらしくなるので必要最低限な感じに。

データベースはSQLite、「データベースのファイルがコピペできる」「デーモンがいらない」「SQL構文でおけ」など便利なのでおすすめ。とくにbotには「データベースのファイルがコピペできる」のは素敵だと思うんだよ、ある程度データそろったらだれかと交換したり、最初からよくできたデータベースを貰って来れたりね!

とはいえ、Twitter botに必要最低限なデータベースなので、2カラム(keyとvalue)なデータベースを作ります。保存するのは「一番最後に見たツィートのメッセージID」と「一番最後に見たダイレクトメッセージのメッセージID」、二重投稿の防止用だね。

SQLiteはインストーラなりなんなりで入れてもらうとして、とりあえずgemでsqlite3ライブラリをインストールしてね。


さて、botのどこでデータベースを使うかというと「前回実行したときのログ保存」に使う。botは基本的に定期的に実行し、作業が終わると終了するので”どのメッセージまで読んだか”は変数ではなく外部に保存しないといけない。大抵はテキストファイルに書き出したりするんだけど、どうせ後から会話辞書用のデータベースも作るので練習もかねてログのデータベースも作ってみる。検索も楽だしね。
会話辞書もテキストファイルに書いてもいいけど、将来的にとんでもない行数になるのでおすすめはできない。テキストファイルの場合は必要な行を見つけるためにファイルを全部読み込んで一行ずつ確認していかないといけないので行数が増えると動作に支障がでるんだよね。。。

データベースを開いてテーブル作成

とりあえずnew関数が便利過ぎワロタw SQLiteのnew関数は「データベースがあれば開く、なかったら新規作成」らしい。あちこちで使うので「logdb」をインスタンス変数にするのを忘れずに!
datasetテーブルはkeyとvalueだけの簡素なテーブル、数字か文字がはいるのでとりあえず"text"型、空だと困るので”not null”、keyはかぶると検索に使えなくなるので”primary key”。
上を見てもわかるとおり、executeの方法は2つある。まずは(1)のようにSQL文で一気に書く例、文字が長くなりがちなのが玉に傷。もう一つが(2)のような方法で、「'status'」や「'normal'」の部分に変数を使うと便利、ただしSQLの文法と若干違ってくるのでsql変数だけ見ても何が起こってるかはわからない。

データベースへの追加およびデータの更新

お次はデータベースへの項目追加の関数。先ほどと違い、定期的に実行するぶぶんなのでrescueして異常終了しないようにしとく。 そして更新、こちらは(1)の方法でやってみた。

データベースへの内容を連想配列で取得

最後にデータベースからの値の取得だけど、executeの返り値は
[["status", "normal"], ["error_start", ""], ["post_error", "0"], ["latestTW", "15925771400"], ["latestDM", "0"]]
みたいな配列なので、使いやすいように連想配列にして返す。
def get_dataset
  rows = @logdb.execute("select * from dataset;")
  return Hash[*rows.flatten]
end
上の用にしておいて以下のコードを実行すると
require 'DatabaseClass'

logdata = DatabaseClass.new
data = logdata.get_dataset
p data
下のような結果が帰ってくる。(実際に使用中のものなので登録されてるデータが多いです。)
{"post_error"=>"0", "error_start"=>"", "latestTW"=>"15925771400", "latestDM"=>"0", "status"=>"normal"}
連想配列(ハッシュ)ってべんりだよね〜

拍手[0回]

PR
忍者ブログ [PR]