本記事では、データベースをあつかいます。
ある程度データの数が多くなると、そのあつかいに注意しないと、メンテナンス性も悪いし速度の向上も期待できません。
テキストファイルで管理すると、誰かが不用意に手作業で書き換えてしまうことも考えられます。
データの変更も容易ではありません。
そこでデータベースが必要になるのです。
本記事では数あるデータベースの中で、SQLiteを取り上げて解説を進めます。
目次
データベースとは何か
冒頭で述べたように、データベースとはデータを管理してくれる便利なソフトウェアです。
もう少し詳細に解説しましょう。
値の読み書きをSQLで簡単にする
住所録をテキストファイルでCSV形式で保存するとしましょう。
欲しい住所を検索して、ヒットした行を取り出して、カンマごとに分割して・・・と毎回やっていては手間がかかって仕方ありません。
そこでデータベースの出番となります。
データベースは内部でデータ管理し、操作するときはSQLという言語でできるようにしています。
つまり本来は複雑な処理を経て初めて得られるデータを、SQlという簡易な開発言語で操作できるのです。
たとえばテーブルからすべてのデータを取るSQLは以下のとおりです。
SELECT * FROM テーブル名
SQLはまるで文章のようで、直感的でわかりやすいですね。
速度向上
単純にテーブルにデータを格納するだけでなく、効率的に目的のデータにたどり着けるように「キー」というものを付加します。
これにより、テキスト検索よりも高速に欲しいデータに飛ぶことができます。
セキュリティ
アクセスできるユーザーごとに、何をどこまで許すのかを設定できます。
つまりデータの更新や削除だけは高権限者のみ許す、といった設定が可能です。
データベースの種類
データベースは、有償無償や製造元を含めて、さまざまな種類が存在します。
有名なものは以下です。
かっこの中は製造元です。
- Oracle(Oracle)
- SQLServer(Microsoft)
- MySQL(Oracle)
- DB2(IBM)
今回は、OSSでかつ軽量であつかいの容易な「SQLite」を使用します。
SQLiteのセットアップ
前置きはこれくらいにして、SQLiteのセットアップにいきましょう。
以下を実行してください。
$ gem install sqlite3
エラーメッセージが何も表示されなければOKです。
データベースとテーブルを作る
データを格納するためには、データベースとテーブルが必要になります。
1つのデータ種ごとに「テーブル」と呼ばれる、いわゆる器にデータを格納します。
テーブルの中身は二次元のデータ、つまりExcelのシートのような形式と思ってください。
データベースとテーブルの関係は、図にすると以下のようになります。
データベースという器の中に、多数のテーブルを格納できます。
今回はこれを一度に両方作ります。
require "sqlite3" SQLite3::Database.open "testdb" do |db| db.execute "CREATE TABLE YUBIN (ZIP TEXT, ADDRESS TEXT)" end
※SQLite以外は、最初にデータベースを作っておく必要があります。
テーブルができたかどうか、件数を取得してみましょう。
テーブルを作っただけでデータがないので、0件となるはずです。
require "sqlite3" SQLite3::Database.open "testdb" do |db| db.execute("SELECT COUNT(*) FROM YUBIN") do |count| puts count end end
[実行結果]
0
テーブルができていない場合は、以下のエラーが返ってきます。
`initialize': no such table: YUBIN (SQLite3::SQLException)
エラーメッセージをまるごとググって対処してください。
データ操作とSQLiteの専用GUIツール
データの操作を、順を追って解説します。
データがないと操作も何もできないので、まずはデータを入れましょう。
データの確認は、SQLiteの専用GUIツール「DB Browser for SQLite」を使ってビジュアル的に確認できます。
このツールはデータを分かりやすく見せるのと同時に、編集や削除といった操作が可能です。
データの挿入 INSERT
データをテーブルに挿入するには、SQLのINSERT文を使います。
require "sqlite3" SQLite3::Database.open "testdb" do |db| db.execute('INSERT INTO YUBIN VALUES("1020072","東京都千代田区神田西福田町");') db.execute('INSERT INTO YUBIN VALUES("1020072","東京都千代田区飯田橋");') end
これでもよいのですが、もう少しスマートにいきましょう。
配列に入れたい値が入っているとして、それをeachで回します。
require "sqlite3" array = [["1010037","東京都千代田区神田西福田町"], ["1020072","東京都千代田区飯田橋"]] SQLite3::Database.open "testdb" do |db| array.each do |val| db.execute 'INSERT INTO YUBIN VALUES(?,?);', val[0], val[1] end end
この結果を確認しましょう。
データが挿入されたのがお分かりでしょうか。
また二次元の表のように見えることも注目しましょう。
データの抽出 SELECT
データを抽出するのはSELECTを使います。
require "sqlite3" SQLite3::Database.open "testdb" do |db| db.execute('SELECT * FROM YUBIN;') do |rows| p rows end end
[実行結果]
["1010037", "東京都千代田区神田西福田町"] ["1020072", "東京都千代田区飯田橋"]
配列として取得できました。
先ほどのDB Browserで出てきた内容と同じ内容が取得できたのがわかりますね。
まとめ
本記事ではデータベース、特にSQLiteのあつかいを解説しました。
削除と更新は割愛しましたが、本記事の内容を理解できればインターネットで情報を検索して対応できます。
またSQLite以外のDBにもぜひチャレンジしてみてくださいね!