Entry

プログラミングメモ - SQLite を C++ で使ってみよう(その1)

2009年08月16日

簡易データベースとして,今やあちこちの製品に組み込まれている SQLite なんですけれど,個人のプログラマ,中でも C/C++ のプログラマは,あまり使っていない気がします。あまりドキュメントがそろっていないのが理由なのかもしれませんけど,非常に便利なので使ってみましょう。

今回は,簡単な SQLite の紹介とインストールの方法をば。

SQLite というのは,いわゆるリレーショナルデータベース(RDB)のデータベースエンジンです。データベースというと,有名どころでは Oracle DB とか MySQL とかいった製品があるけれども,SQLite もその仲間。テーブルとその関連(リレーション)を使って,プログラムが使うデータを永続化すること(プログラムが終了しても残る形でデータを保存/管理すること)ができます。

で,この SQLite なんですけれど,同種の製品と比べて非常にシンプルに作られています。ざっとまとめると,次のような特徴がある。

  • シンプルで速い。
  • 1データベースが1ファイルと対応する。
  • TCP/IP を使わないので,サーバを立てる必要がない。
  • ライブラリとして提供されているので,自分のプログラムに DB エンジン本体を組み込むことができる。
  • SQL92 をほぼサポート。

C/C++ で永続化したデータを扱う場合,なかなか難しいところがあって,CSV や XML に書き出したり,MFC のようなクラスライブラリを使っているなら,シリアライズ機能を使ったりして管理していたのでした。しかし,これらの方法は,可搬性には乏しいし,ファイルフォーマットを自分で作らなくちゃいけない不都合もありました。また,少し凝ったアプリケーションになると,MySQL のような DB を利用することが考えられるけれども,今度は DB サーバを立ち上げる面倒と付き合わなくちゃいけなくなります。

SQLite は,機能こそ本格的な DB と比べてやや劣るものの,速くて可搬性に富んだ永続化エンジンを提供します。アプリケーションのファイルフォーマットを作る場合,ファイル操作や解析ルーチンを自前で書かなくても,ライブラリの中ですべてやってくれる。検索もばっちりです。1データベースが1ファイルに対応しているので,データベースのバックアップもファイルをコピーするだけでいい。中規模程度のアプリケーション/システムだったら,十分お手軽に使うことができるはずです。

ここでは,現在の最新版である,SQLite 3.6.17 を C++ から使うことにします。開発環境は,以下の通りです。

OSWindows XP Professional SP3
IDEMicrosoft Visual Studio 2008
C++ CompilerIntel Compiler 11.1

あたしんとこのコンパイラは,少し特殊なんですけれど,普段お使いのコンパイラで十分コンパイル/リンクできるはずです(VC++ 6.0 でも検証済み)。

SQLite をダウンロードする

さて,SQLite の概略は以上の通りとして,早速 SQLite を使えるようにしましょう。SQLite は SQLite のサイトの以下のページからダウンロードすることができます。

配布物がいろいろあるんですけれど,今回は,Windows 上で使うので,コンパイル済みの配布物を選ぶことができます。"Precompiled Binaries For Windows" の項にある,次のファイルをダウンロードしましょう。

sqlite-amalgamation-*.zipソースコード
sqlite-*.zipコマンドラインで動く SQLite のアプリケーション
sqlitedll-*.zip組み込み用の DLL

"*" にはバージョン番号が入ります。ここでは,sqlite-amalgamation-3_6_17.zip と sqlite-3_6_17.zip,それと sqlitedll-3_6_17.zip をもらってきました。実際に自分のプログラムに埋め込むパッケージは,DLL のパッケージなんですけれど,コマンドラインのアプリケーションは,動作検証に使ったり,テスト用のデータを作ったりするのに使うので,一応ダウンロードしておきましょう。ソースコードは,ヘッダファイルだけを使います。

SQLite をインストールする

ダウンロードしたパッケージは,ZIP 形式で圧縮されているので,解凍ツールをつかって解凍します。次のようなファイルが入っているはず。

パッケージファイル説明
sqlite-*.zipsqlite3.exeコマンドラインアプリケーションの実行モジュール
sqlitedll-*.zipsqlite3.dllDLL の本体
sqlite3.defモジュール定義ファイル
sqlite-amalgamation-*.zipsqlite3.c実装ファイル(使わない)
sqlite3.hヘッダファイル
sqlite3ext.h追加のヘッダファイル

このうち,sqlite3.exe と sqlite3.dll をパスの通った場所にコピーします。パスの通し方はご存知ですよね。ここでは,C:\home\aian\bin 以下にコピーしてパスを通しました。sqlite3.def は,後述するスタブライブラリを作るのに必要なので,適当なところに置いておきます。ここでは,C:\home\aian\temp 以下に置いています。ヘッダは今回使わないんですけれど,同じところに置いておきましょう。

これでインストールは終わりです。簡単ですね。

動作確認してみる

インストールしたら,ちゃんと動くか確認しておきましょう。コマンドプロンプトを開いたら,適当なディレクトリで次のように入力します。

C:\home\aian> sqlite3 -help

パスが通っていたら,次のようなヘルプが表示されるはずです。

C:\home\aian> sqlite3 -help
Usage: sqlite3 [OPTIONS] FILENAME [SQL]
FILENAME is the name of an SQLite database. A new database is created
if the file does not previously exist.
OPTIONS include:
   -init filename       read/process named file
   -echo                print commands before execution
   -[no]header          turn headers on or off
   -bail                stop after hitting an error
   -interactive         force interactive I/O
   -batch               force batch I/O
   -column              set output mode to 'column'
   -csv                 set output mode to 'csv'
   -html                set output mode to HTML
   -line                set output mode to 'line'
   -list                set output mode to 'list'
   -separator 'x'       set output field separator (|)
   -nullvalue 'text'    set text string for NULL values
   -version             show SQLite version

もう少し操作してみます。sqlite3 コマンドの詳細は他に譲るとして,次のように入力して,期待通りの結果になるか,確かめましょう。

C:\home\aian>sqlite3 test.db
SQLite version 3.6.17
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .database
seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             C:\home\aian\test.db
sqlite> CREATE TABLE test (
   ...> id INTEGER PRIMARY KEY,
   ...> name TEXT NOT NULL
   ...> );
sqlite> .tables
test
sqlite> SELECT * FROM test;
sqlite> INSERT INTO test (name) VALUES ('foo');
sqlite> INSERT INTO test (name) VALUES ('bar');
sqlite> INSERT INTO test (name) VALUES ('baz');
sqlite> SELECT * FROM test;
1|foo
2|bar
3|baz
sqlite> .quit

やっていることを一応説明しておくと,まず test.db というファイルを作って,SQLite を起動。SQLite のコマンドに入って .database で作成したデータベースを確認します。次に,SQL を投げてテーブル作成し(CREATE TABLE),データを挿入(INSERT)した後,内容を確認(SELECT)。最後に,.quit コマンドでアプリケーションを終了しています。

無事に操作できることを確認したら,.database コマンドで表示されたファイルパスに,test.db というファイルがあることを確認してください。これが,SQLite で作ったデータベースファイルです。作ったデータベースの情報は,すべてここに入っています。

確認したら,コマンドライン版の動作確認は終わりです。DLL 版の動作確認は,プログラムを組む必要があるので後回しにしておきます。

スタブライブラリを作る

今回の締めくくりして,DLL 版の SQLite をプログラムに組み込めるように,スタブライブラリを作っておきましょう。

スタブライブラリというのは,DLL とリンクするときに必要になるライブラリのことです。Windows のプログラミングで DLL を使ったことのある方はおなじみですよね。今回 SQLite のライブラリは DLL で動的にリンクすることになる(実行時にリンクされる)ので,ライブラリの本体は作るプログラムに埋め込まれません。静的にリンクする(コンパイル時にリンクする)場合は,本体をそのまま埋め込めばいいんですけれど,動的にリンクする場合は,本体を埋め込む代わりに,どの DLL とリンクすればいいのか,といった情報を,アプリケーションに埋め込んでおくわけです。その情報が入ったライブラリを,スタブライブラリといいます。

ま,ここら辺の話は込み入っているので,よく分からない方は,SQLite を DLL で使うには,スタブライブラリなるもんとリンクする必要があるんだな,と覚えてもらえば結構です。

で,リンクするスタブライブラリなんですけれど,SQLite の場合は,*.lib の形で提供されていません。これは,MS VS の場合,付属の lib コマンドで作ることになります。lib コマンドにパスが通っていることを確認して,次のようにして作りましょう。

C:\home\aian\temp> lib /DEF:sqlite3.def /MACHINE:X86 /OUT:sqlite3.lib
Microsoft (R) Library Manager Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

   ライブラリ sqlite3.lib とオブジェクト sqlite3.exp を作成中

正常に終了すれば,sqlite3.lib ができているはずです。これがスタブライブラリ。プログラムを作る場合,これとリンクすることになります。なお,VC++ 6.0 についている古い lib コマンドの場合,MACHINE オプションの設定値が X86 ではなく,I386 になっているかもしれません。適宜変更して作ってみてください。

まとめ

以上で,SQLite のインストールとプログラミングの準備は終わりです。プログラミングに必要な,DLL ファイルとスタブライブラリ(sqlite3.lib),それにヘッダファイルは大切に取っておきましょう。

今回は,タイトルの割に C++ が出てきませんでした。次回は,実際に SQLite をアプリケーションに組み込んで使うことにします(次回に続く)。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN