Ruby で SQLite ってみた
require 'sqlite3'
# データベースを作成します。 # 直ぐに空のデータベースファイル 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
# 処理を連続して行う場合は、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
データベースを閉じて終了。
おつかれさまでした〜。