2012.05.01
yna 開発

RubyでSqlite3を使う

perlやrubyには、SDBやGDBというハッシュ形式でデータを保存する仕組みがあり、ランダムアクセスが可能なため比較的データ件数の多いデータに対しても有効な仕組みが提供されています。
これ以上に大掛かりなデータを扱うにはMySqlやPostgreSQLのようなデータベースを使用するのが一般的です。ただデータベースは、サービスやデーモンですので、レンタルサーバーで提供されているとは限りません。また、データを外部から持ってきたり、データをバックアップしたりするには、ちょっとファイルをscpやftpで持ってきたりというわけにはいきません。
そこで使われるようになったきたのが、sqliteです。
Sqliteには次のような特徴があります。

・データベース本体がライブラリ形式で提供されるため、サービス(デーモン)のインストールなどの手順が不要で可搬性に優れる。
・データベースが1つのファイルで、CPUを選ばないデータ形式のため、コピーするだけで、使用することができます。
・SQL92に準拠しているので、機能的に不足はない。トランザクションもサポートされています。

ただし、処理が衝突したを場合など別プロセスを待機したりせずにエラーになるので、積極的にトランザクションを使用したほうが安全です。
Ruby on Railsの標準DBは長らくMySqlでしたが、最近ではSqliteを標準DBとして採用しています。

さて、今回はRailsでおなじみのActiveRecordではなくて、PerlでおなじみのDBIを使ってみましょう。DBIは、データベース独立インターフェースと呼ばれ、データベースによらない独立したインターフェースを提供しています。
DBIはRubyの標準パッケージに含まれていませんので、別途組み込む必要があります。

> gem install dbi

次にsqlite3のDBドライバーを組み込みます。

> gem install dbd-sqlite3

sqliteはsqlite3やsqlite3-rubyを参照していますので、必要なパッケージを芋づる式にインストールしてくれます。ユーザーはパッケージの依存関係を気にせずにインストールできるようになっています。

sqliteの内部文字列はutf8を想定しています。このあたりは、いろいろな文字コードを扱えるMySqlやMSDEなどのほうが強力ですが、RubyやPerlに関する限りutf8オンリーでも不都合はありません。
しかしsqlite3.exeというコマンドライン版では不都合なことに漢字コード変換をしてくれません。そのため、Windowsで使用するにはちょっと問題があります。さらにコマンドラインだけでデータベースを操作するのはかなり面倒です。
日本語で使い勝手のいいソフトを探したところPupsqliteというソフトが見つかりましたのでこれを使ってみます。

https://www.forest.impress.co.jp/lib/offc/business/db/pupsqlite.html

このソフトは、zip圧縮されており、それを適当なフォルダーに展開するだけで使用できます。使用するライブラリが標準的なものであれば、sqliteを使用したソフトは特別なインストーラーを使用せずに配布できるところも魅力です。

なにもデータがないのは寂しいので、ちょっと簡単なテーブルを作成します。

CREATE TABLE [mst_user] (
  [id] INTEGER PRIMARY KEY AUTOINCREMENT,
  [name] TEXT NOT NULL,
  [mail] TEXT NOT NULL,
  [passwd] TEXT NOT NULL
);

sqliteの型は、TEXT、INTEGER、REAL、DATETIME、BOOLEAN,BLOBといたってシンプルです。
データを入力します。

 では、これを表示してみましょう。

# -*- encoding: UTF-8 -*-
#

require 'dbi'
require 'time'

	$db_file = 'test.db3'
	$db_url  = "DBI:SQLite3:#{$db_file}"

	dbh = DBI.connect( $db_url )
	dbh['AutoCommit'] = true

	sqlSelect = "SELECT *, name as TEST FROM mst_user "

	dbh.execute(sqlSelect){|stm|
		stm.each{|row|
			printf "%4d %-20s %-24s %-10s\n", row["id"], row["name"], row["mail"], row["passwd"]
		}
	}

実行します。

   1 柳田 左人志      yanagita@examople.jp *******
   2 伊藤 博文        itoh@example.jp      *****

なんとか、使える状況まできましたので、そのうちもう少し掘り下げてみたいと思います。

yna

一覧に戻る