VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
rails new を実行すると、開発環境では MySQL ではなく SQLite になります。Rails 8 アプリケーションを MySQL に向けるには、スキャフォールド時の明示的なフラグが 1 つ、実在するユーザーとホストを指定する database.yml、およびコンパイルにネイティブの MySQL クライアントライブラリを必要とする gem が必要です。このガイドでは、稼働中の MySQL 互換サーバーに対してこの 3 つを順に進めます。以下のすべては、実際に VillageSQL をデータベースとして実行したものです。
スキャフォールドの前にツールチェーンを確認する
Rails 8 には Ruby 3.2 以降が必要です。rails new を実行する前に、マシンに何があるかを確認します。
PATH でシステムの Ruby より前に置きます。
ruby 4.0.6 (2026-07-14 revision 03b6d3f889) +PRISM [arm64-darwin25] で、Rails 8 の下限を十分に上回っています。Rails 自体は、gem install rails が解決するバージョンに任せるのではなく、バージョン制約を付けてインストールします。
~> 8.0 という演算子は「8.0 以上、9.0 未満」を意味するため、Rails 8.1 はこの制約を満たします。
MySQL アダプターでスキャフォールドする
Rails 8 のデフォルトは MySQL でも PostgreSQL でもありません。rails new --help を実行すると、実際のデフォルトが表示されます。
mysql が正しい値で、mysql2 の gem とアダプターを選択します。trilogy は Rails がサポートする別個の純粋な Ruby 製 MySQL プロトコルアダプターで、このガイドの選択とは異なります。mysql の値でアプリをスキャフォールドします。
Gemfile に mysql2 が書き込まれ、adapter: mysql2 があらかじめ設定された config/database.yml が生成されます。--skip-git は省略可能で、アプリのディレクトリをそれ自体の git リポジトリにしない場合にのみ関係します。
mysql2 gem にはネイティブ拡張があり、コンパイルにはヘッダー付きの MySQL クライアントライブラリが必要です。それがないと、bundle install は mysql2 のステップで失敗します。Homebrew を使う macOS では次のようにします。
mysql-client は Homebrew では keg-only です(完全な mysql フォーミュラと競合するため、/opt/homebrew にシンボリックリンクされません)。これこそが、PATH に頼るのではなく、bundle config に場所を明示的に伝える必要がある理由です。この設定により、bundle install は Rails 8.1.3.1 の依存関係一式とともに mysql2 0.5.7 をコンパイルしてインストールしました。
専用のデータベースとユーザーを作成する
新しいアプリケーションをroot アカウントに向けないでください。稼働中のサーバーにデータベースとスコープを絞ったユーザーを作成します。
rails_app には localhost からではなく 127.0.0.1 からのアクセスが付与されているため、config/database.yml は Unix ソケットではなく TCP 経由でこのユーザーに向けます。
rails db:create が実際に必要とするもの
rails db:create は、現在の RAILS_ENV の下に指定されたデータベースだけを作成するわけではありません。rails_app に rails_guide.* だけの権限を付与した状態で実行すると、次の結果になりました。
rails_guide は正常に作成されました。GRANT ALL PRIVILEGES ON rails_guide.* は、まだ存在しないデータベースを作成するのに十分です。付与は既存のオブジェクトではなくデータベース名にスコープされているからです。しかし rails db:create は同じ実行で test 環境のデータベースも作成しようとし、rails_guide_test には権限が付与されていませんでした。このタスクはデフォルトで development と test の両方のデータベースを作成します。除外されるのは production だけです。
2 つ目のデータベース名に権限を付与すると解決します。
RAILS_ENV で指定した 1 つだけでなく、Rails が作成しようとするすべてのデータベース名に権限が付与されていれば、rails db:create には十分です。スーパーユーザーやグローバルな CREATE 権限は必要ありません。
マイグレーションしてサーバーに直接確認する
Post モデルを生成してマイグレーションします。
ルートとコントローラーを配線し、サーバーに対してテストする
index と create のリソースフルなルートを追加します。
curl で両方のアクションを実行します。
created_at が mysql2 を通して正しく往復したことを確認しています。
コネクションプールのサイズと Puma のスレッド数は同じ数値
Rails 8.1 が生成するdatabase.yml は、古い Rails バージョンでおなじみの pool キーをもう使いません。max_connections を使います。
pool: キーも引き続き機能し、警告は出ません。max_connections が存在しない場合、max_connections はそれにフォールバックします。これは非推奨の経路を伴わない単純な参照です。Rails 8.1 が非推奨にしたのは Ruby メソッドの HashConfig#pool で、現在は HashConfig#max_connections のエイリアスです。これは database.yml のキーとは別のものです。両方のキーを異なる値に設定した場合、黙って解決されることはありません。起動時に例外が発生します。
config/puma.rb はそれを直接読み取り、そのことを明示するコメントが付いています。
RAILS_MAX_THREADS が未設定の場合、database.yml は 5 接続にフォールバックし、puma.rb は 3 スレッドにフォールバックします。デフォルトのままだと、プールには Puma が使えるスレッド数より多い接続があります。これは安全ですが、わずかに無駄です。目標のスレッド数が決まったら RAILS_MAX_THREADS を明示的に設定すれば、両方の設定が一緒に動きます。危険なのは、プールがスレッド数より小さい方向です。スレッドは空き接続を待ってキューに入り、負荷がかかると、ログにそれを説明するエラーが何もないままリクエストのレイテンシとして現れます。
よくある質問
--database=mysql はすべての Rails 8 バージョンで同じ gem をインストールしますか?
Rails 8 の範囲内では、はい。mysql2 gem と mysql2 アダプターに解決されます。これは Rails 8.1.3.1 の rails new --help で確認しました。trilogy は同じフラグに対する別の有効な値です。ネイティブ拡張のコンパイルを伴わない純粋な Ruby 製の MySQL ワイヤプロトコルクライアントで、別の gem を使うことと引き換えに mysql-client ヘッダーへの依存をなくします。スキャフォールド時にどちらかを選んでください。database.yml と Gemfile に手を入れずに後から入れ替えられる互換アダプターではありません。
rails db:create に、単なる CREATE 権限ではなくデータベース固有の付与が必要なのはなぜですか?
MySQL の GRANT ... ON dbname.* TO user は dbname がまだ存在しなくても機能し、その特定のデータベースの作成を許可します。別の名前のデータベースの作成は許可しません。rails db:create は config/database.yml から development と test の両方のデータベースを 1 回の実行で作成するため、スコープを絞ったユーザーには、日常的に使う予定の環境に対する 1 つの付与ではなく、それぞれを指定した付与が必要です。
VillageSQL に対するマイグレーションは、標準の MySQL に対する場合と違う方法で実行する必要がありますか?
いいえ。このガイドのすべてのコマンド、rails db:create、rails db:migrate、rails generate model は、VillageSQL サーバーに対して変更なしで実行しました。VillageSQL は MySQL のドロップイン代替であるため、mysql2 と ActiveRecord の MySQL アダプターは、MySQL 自体に対する場合と同じワイヤプロトコルと同じ SHOW/DESCRIBE の出力を見ます。
トラブルシューティング
関連項目
- ORM で MySQL を使う: Django、Rails、および Prisma — 3 つのフレームワークにわたる、設定レベルでの Rails の構成
- MySQL のコネクションプーリング — 特定のフレームワークに依存しないコネクションプーリングの動作