🙄

migrationによりSinatraでデータベースを操作する方法(SQLite3 + ActiveRecord)

2023/06/14に公開

前知識ーRailsの場合のデータベース操作について

  • データベースとのやり取りは、テーブル毎に用意されたモデルで行われます。
  • Ruby言語(オブジェクト指向言語)と、リレーショナルデータベース言語の橋渡しとして「O/Rマッパー」というものが使用されます。
  • 「O/Rマッパー」により、データベースから取得した情報を変換する作業が不必要になったり、データベースを扱うためのSQLを記述する必要もなくなるため、効率的に開発を進めることができます。

Sinatraでデータベースの作成と接続

データベース接続の設定を行います

まずはActiveRecordライブラリを読み込みます。

require 'sinatra/activerecord'

データベースの接続情報を記述します

ActiveRecord::Base.establish.connection(
  "adapter"  => "sqlite3",
  "database" => "db/development.sqlite3",
  "host"     => "localhost",
  "username" => "root",
  "password" => "",
  "encoding" => "utf8"
)

ActiveRecordモジュールのBaseクラスで接続情報を記述します。
.establish.connectionは接続情報を記述するメソッドです。

データベースにアクセスするためのモデルクラスを作成する

テーブルにアクセスするモデルクラスを作成します。

class User < ActiveRecord::Base
 # ここには何も記述しなくても大丈夫
 # 親クラスのActiveRecord::Baseがカラムなどを自動的に使えるようにしてくれます
end

ActiveRecordはUserというクラス名から、usersというテーブルを自動的に設定してくれます。

マイグレーションファイルによるデータベースの作成をする

データベースの接続設定をconfig/database.ymlのファイルに定義していきます。

  • 使用するデータベースの種類
  • 接続先のIPアドレス
    など
database.ymlRuby
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

#開発
development:
  <<: *default
  database: db/development.sqlite3

データベースに設定できるパラメータ一覧

パラメータ名 概要
adapter 接続するデータベースの種類(sqlite、mysql2、postgresql)
database データベース名(SQLiteではデータベースファイルのパス)
host ホスト名/IPアドレス
port ポート番号
pool 確保する接続プール※1
timeout 接続タイムアウト時間
encoding 使用する文字コード
username ユーザー名
password パスワード
socket ソケット

※1: 接続プールとは:データベースへの接続をあらかじめ準備しておき、利用後はプールに戻し再利用する。これにより、本来通信したいデータ以外の制御用のデータのやり取りを軽減できる。

データベースにusersテーブルを作成するためのmigrationファイルを作成する

ターミナルにコマンドを入力して、usersテーブルを作成するためのmigrationファイルを作成します。
bundle exec rake db:create_migration NAME=create_users
と打つと、/db/migrateディレクトリーに /db/migrate/20230614054536_create_users.rb のようなファイルが生成されます。
※カラムの追加:bundle exec rake db:create_migration NAME=AddDetailsToTitles price:integer

usersテーブルの内容を記述する

生成されたファイルにカラムの名前やデータ型などを記述します。

/db/migrate/20230614054536_create_users.rb
class CreateUsers < ActiveRecord::Migration[7.0]
  def change
    create_table :users do |t|
      t.text :name
      t.text :password
    end
  end
end

migrateファイルの中身をデータベースに反映する

bundle exec rake db:migrateコマンドを実行して以下のような結果が得られれば、usersテーブルは正しく作成できています。

== 20230614054536 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0008s
== 20230614054536 CreateUsers: migrated (0.0009s) =============================

おまけ

マイグレーションファイルの状態を見るコマンド
bundle exec rake db:migrate:status

  • 特定のmigrationファイルを実行する(up/down)コマンド
    bundle exec rake db:migrate:up VERSION=20230614xxxxxx
    bundle exec rake db:migrate:down VERSION=20230614xxxxxx
  • 全てのmigrationを実行してテーブルを再作成するコマンド
    ※必ず、先にdownさせてから実行すること
    bundle exec rake db:migrate:reset
  • 全てのレコードを空にするコマンド
    ※必ず、先にdownさせてから実行すること
    bundle exec rake db:reset

データベース操作CRUD処理

CRUD処理の「CRUD」とは、データの「作成(Create)」、「参照(Read)」、「更新(Update)」、「削除(Delete)」の頭文字をとっています。

  • 新規データ作成Create処理
    データのオブジェクト作成する
user = User.new(user_name: '名前1')

データベースへ保存する

user.save
  • データの参照Read処理
    保存したデータを取り出しuser変数に保存する
user = User.find(user.id)
  • データの更新Update処理
    name変数に格納されたデータを更新する
name.user_name = "name1"
name.save
  • データの削除Delete処理
name.destroy

Discussion