Ruby で SQLite ってみた

Ruby で sqlite3 を使うにはコマンドプロンプトにこんな風に打ってね。

gem install sqlite3-ruby

使う時は上の方に:

require 'sqlite3'

って書いとけばおk。
次は早速データベースを作成しよう。
今回の例題は SQLで集合演算[codezine.jp] の「差集合で関係除算を表現する」ってとこ。

# データベースを作成します。
# 直ぐに空のデータベースファイル employees.db ができます。
# 既に存在する場合は、読み込むだけです。
db = SQLite3::Database.new( "employees.db" )

これで、コメントにも書いてある通り、employees.db ができるよ。
既に存在してるときは、読み込まれるだけだから、大丈夫。
作成したときは、空っぽなのでテーブルを作ろう。

# めんどいので、一度にテーブルを 2 つ作ることにします。
create_query = <<-SQL
create table Skills (
    skill_id int primary key,
    skill_name text not null
);

create table EmpSkills (
    empskill_id int primary key,
    employee_name text not null,
    skill_name text not null
);
SQL

うわぁ! 大変だー(棒
SQL ステートメントが 2 つもあるぞー。
無事に実行できるのかな−?

おまかせください!
execute_batch メソッドを使えば、複数の SQL ステートメントでもトランザクション 1 つで評価することができるんです!!
では早速やってみましょう。

# 複数ステートメントを実行する場合は、execute_batch メソッドを使います。
db.execute_batch( create_query )

無事に作成できたら今度はテーブルにレコードを詰めてみよう。

#
# Skills の方のレコードを挿入します。
#
# 名前付きプレースホルダーも指定できます。
sql_query = <<-SQL
insert into Skills ( skill_name ) values ( :skill_name )
SQL

SQL ステートメントを文字列で書いておくよ。
名前付きプレースホルダーを使えば、execute するときに楽なんだ。

# 処理を連続して行う場合は、transaction ブロック内で一度にすべて処理しときます。
db.transaction do
  [ "Oracle", "UNIX", "Java" ].each do |content|
    # skill_id は primary key なので、挿入するごとに 1 足されていきます。
    db.execute( sql_query, :skill_name => content )
  end
end

こんな風にね。
そら、もういっちょ。

sql_query = <<-SQL
insert into EmpSkills ( employee_name, skill_name ) values ( :employee_name, :skill_name )
SQL

db.transaction do
  #
  # EmpSkills の方のレコードを挿入します。
  #
  { "相田" => [ "Oracle", "UNIX", "Java", "C#" ],
    "神崎" => [ "Oracle", "UNIX", "Java" ],
    "平井" => [ "UNIX", "Oracle", "PHP", "Perl", "C++" ],
    "若田部" => [ "Perl" ],
    "渡来" => [ "Oracle" ]
  }.each do |k, v|
    v.each do |x|
      db.execute( sql_query, :employee_name => k, :skill_name => x )
    end
  end
end

Ruby でよかった。ほんとに。
分かり易いもん。
ということで、

# データベースを閉じます。
db.close

データベースを閉じて終了。
おつかれさまでした〜。