初心者でも簡単!Rubyとデータベースを活用した10のステップ – Japanシーモア

初心者でも簡単!Rubyとデータベースを活用した10のステップ

初心者向けRubyとデータベース利用ガイドRuby
この記事は約15分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

このサービスは複数のSSPによる協力の下、運営されています。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

皆さん、Rubyとデータベースの組み合わせについて知りたいと思っていませんか?

今回は、そんな初心者の方々のために、Rubyとデータベースを活用した10のステップを解説します。

私たちのプロジェクトをさらに強力なものにするため、この2つの要素をどのように組み合わせるか、具体的に学びましょう。

●Rubyとデータベースとは

Rubyは、使いやすさと効率性を重視したプログラミング言語です。

一方、データベースは、データの整理、格納、管理を助けるシステムです。

Rubyとデータベースを一緒に使うことで、データドリブンなアプリケーションを効率的に構築できます。

●Rubyでデータベースを扱う基本

Rubyでデータベースを扱うには主に2つの方法があります。

1つ目はSQLを直接書く方法、2つ目はActiveRecordというライブラリを使用する方法です。

○RubyでSQLを書く方法

まず初めに、Rubyで直接SQLを書く方法について見ていきましょう。

この方法は、DBIというライブラリを利用します。

require 'dbi'

begin
  dbh = DBI.connect('DBI:Mysql:test:localhost', 'testuser', 'testpassword')

  row = dbh.select_one("SELECT VERSION()")
  puts "Server version: #{row[0]}"

rescue DBI::DatabaseError => e
  puts "An error occurred"
  puts "Error code: #{e.err}"
  puts "Error message: #{e.errstr}"
ensure
  dbh.disconnect if dbh
end

このコードではDBIライブラリを使ってデータベースに接続し、データベースのバージョンを取得しています。

例外処理も含まれており、エラーが発生した場合にはエラーコードとエラーメッセージを出力します。

このコードを実行すると、「Server version:」に続けてデータベースのバージョンが表示されます。

もしエラーが発生した場合には、「An error occurred」に続けてエラーコードとエラーメッセージが表示されます。

○ActiveRecordの基本

次に、ActiveRecordの基本について解説します。

ActiveRecordはRuby on Railsで採用されているORM(Object-Relational Mapping)ライブラリで、データベースの操作をオブジェクト指向的に行うことが可能です。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
end

user = User.find(1)
puts user.name

このコードではActiveRecordを使ってデータベースに接続し、ユーザーの情報を取得しています。

この例ではUserというモデルを作成し、そのモデルを通じてデータベースにアクセスしています。

このコードを実行すると、IDが1のユーザーの名前が出力されます。

もしユーザーが存在しない場合やエラーが発生した場合にはエラーメッセージが表示されます。

●Rubyでデータベースを操作する10のステップ

さて、ここからはRubyを使ってデータベースを操作する10のステップについて具体的に解説します。

下記のステップを一つずつ学びながら、Rubyでデータベースを効率的に活用する方法を身につけましょう。

○ステップ1:Rubyでのデータベース接続

まず初めに、Rubyを使ってデータベースに接続する方法について学びます。

require 'dbi'

begin
  dbh = DBI.connect('DBI:Mysql:test:localhost', 'testuser', 'testpassword')

  puts "Successfully connected"

rescue DBI::DatabaseError => e
  puts "An error occurred"
  puts "Error code: #{e.err}"
  puts "Error message: #{e.errstr}"
ensure
  dbh.disconnect if dbh
end

このコードでは、DBIライブラリを使ってMySQLデータベースに接続します。

接続に成功した場合は”Successfully connected”と出力され、エラーが発生した場合はエラーメッセージが出力されます。

○ステップ2:データベースから情報を取得

次に、データベースから情報を取得する方法を学びます。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
end

user = User.find(1)
puts user.name

このコードでは、ActiveRecordを使ってデータベースに接続し、IDが1のユーザーの名前を取得します。

取得したユーザーの名前はターミナルに出力されます。

○ステップ3:データベースに情報を挿入

次は、データベースに情報を挿入する方法を見ていきます。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
end

user = User.new
user.name = "New User"
user.save

puts "New user created: #{user.name}"

このコードでは新たなユーザーを作成し、その名前を”New User”に設定してからデータベースに保存します。

その後、新しく作成されたユーザーの名前がターミナルに出力されます。

○ステップ3:データベースに情報を挿入

続けて、Rubyを使ってデータベースに情報を挿入する方法について学びましょう。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
end

user = User.new
user.name = "New User"
user.save

puts "New user created: #{user.name}"

このコードでは、新たなUserオブジェクトを作成し、そのname属性に”New User”を設定した後、saveメソッドを用いてデータベースに保存しています。

新規作成されたユーザーの名前は”New User”という文字列が出力されます。

○ステップ4:データベースの情報を更新

次は、データベースの情報を更新する方法について見ていきましょう。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
end

user = User.find(1)
user.name = "Updated User"
user.save

puts "User updated: #{user.name}"

このコードでは、ActiveRecordのfindメソッドを使って特定のユーザーを探し出し、その名前を”Updated User”に変更してからデータベースに保存します。

更新後のユーザーの名前は”Updated User”という文字列が出力されます。

○ステップ5:データベースから情報を削除

さて、次にデータベースから情報を削除する方法について学んでいきます。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
end

user = User.find(1)
user.destroy

puts "User deleted"

このコードでは、ActiveRecordのfindメソッドを使って特定のユーザーを探し出し、destroyメソッドを使ってそのユーザー情報をデータベースから削除しています。

ユーザー情報が削除されたことを確認するため、”User deleted”という文字列が出力されます。

○ステップ6:複雑なクエリを実行

RubyとActiveRecordを使ってデータベースから複雑なクエリを実行する方法を解説します。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
end

users = User.where("age > ? AND job = ?", 20, "Engineer")

users.each do |user|
  puts "User: #{user.name}"
end

このコードでは、ActiveRecordのwhereメソッドを用いて、20歳以上で職業がエンジニアのユーザーを探しています。

条件に合致するユーザーの名前が出力されます。

○ステップ7:データベーストランザクションの扱い

次に、データベーストランザクションの扱い方について学びましょう。

トランザクションは一連のデータベース操作をひとまとめにし、全て成功するか、全て失敗するかという単位です。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
end

ActiveRecord::Base.transaction do
  user1 = User.find(1)
  user1.name = "Updated User 1"
  user1.save!

  user2 = User.find(2)
  user2.name = "Updated User 2"
  user2.save!
end

このコードでは、2つのユーザー情報の更新を1つのトランザクションで実行しています。

もし途中で何か問題が発生し、一部の操作が失敗すると、トランザクションはロールバックされ、この操作が始まる前の状態に戻ります。

○ステップ8:データベースのエラーハンドリング

さて、データベース操作中にエラーが発生した場合の対処法について学びます。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
end

begin
  user = User.find

(99999)
rescue ActiveRecord::RecordNotFound => e
  puts "Error occurred: #{e.message}"
end

このコードでは、存在しないユーザーを探そうとした時に発生するエラーを、begin/rescue構文を使って捕捉し、エラーメッセージを表示しています。

Rubyの例外処理機能を使うことで、思わぬエラーからアプリケーションを守ることができます。

○ステップ9:データベースの最適化

データベースのパフォーマンスを最適化するための方法を学びます。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
  has_many :orders
end

class Order < ActiveRecord::Base
  belongs_to :user
end

users = User.includes(:orders).where("users.age > ?", 20)

users.each do |user|
  puts "User: #{user.name}, Order Count: #{user.orders.size}"
end

このコードでは、includesメソッドを使用して、ユーザーとその注文情報を一度に取得しています。

これにより、各ユーザーの注文情報を取得するために必要なクエリの数を大幅に削減し、パフォーマンスを向上させています。

○ステップ10:データベースのセキュリティ

最後に、データベースのセキュリティについて学びます。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
end

input_name = "'; DROP TABLE users; --"
users = User.where("name = ?", input_name)

users.each do |user|
  puts "User: #{user.name}"
end

このコードでは、whereメソッドの引数に直接文字列を渡さず、プレースホルダを使用しています。

これにより、悪意のあるユーザーからのSQLインジェクション攻撃を防ぐことができます。

●データベース操作におけるトラブルシューティング

データベース操作には様々なトラブルがつきものです。

エラーメッセージの理解や問題の特定は非常に重要なスキルとなります。

下記のコードは、SQL文のエラーをキャッチするためのものです。

エラーが発生した場合はその内容を表示し、プログラムは停止せずに続行します。

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'testuser',
  password: 'testpassword',
  database: 'test'
)

class User < ActiveRecord::Base
end

begin
  User.connection.execute("SELECT * FROM users WHERE name = 'John'")
rescue ActiveRecord::StatementInvalid => e
  puts "エラーが発生しました: #{e.message}"
end

このコードでは、”rescue”を使って特定のエラーをキャッチしています。エラーが発生すると、そのエラーメッセージを表示します。

これにより、どのSQL文でエラーが発生したのかを特定しやすくなります。

まとめ

以上がRubyとデータベースを活用した10のステップです。

これらのステップを通じて、Rubyとデータベースの基本的な操作、そしてそれらを用いてプログラムを強化するための方法を学んだことでしょう。

初心者であっても一歩一歩進めば、Rubyとデータベースを用いたプログラムの開発は決して難しくはありません。

これらのステップを参考に、自分自身のプロジェクトに活かしてみてください。

さらに深く学びたい方のために、RailsやSQL、ActiveRecordなどに関する追加リソースも提供します。

これらのリソースを活用して、知識を深めてください。