migrationによりSinatraでデータベースを操作する方法(SQLite3 + ActiveRecord)
前知識ー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テーブルの内容を記述する
生成されたファイルにカラムの名前やデータ型などを記述します。
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