Rails Framework と ActiveRecord ORM を使用して TiDB に接続する
TiDB は MySQL 互換データベース、 レールは Ruby で書かれた一般的な Web アプリケーション フレームワーク、 ActiveRecord ORMは Rails のオブジェクト リレーショナル マッピングです。
このチュートリアルでは、TiDB と Rails を使用して次のタスクを実行する方法を学習できます。
- 環境をセットアップします。
- Rails を使用して TiDB クラスターに接続します。
- アプリケーションをビルドして実行します。オプションで、ActiveRecord ORM を使用した基本的な CRUD 操作のサンプルコードスニペットを見つけることができます。
注記:
このチュートリアルは、TiDB サーバーレス、TiDB 専用、および TiDB セルフホストで動作します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
TiDB クラスターがない場合は、次のように作成できます。
- (推奨) TiDB サーバーレスクラスターの作成に従って、独自のTiDB Cloudクラスターを作成します。
- ローカル テスト TiDB クラスターをデプロイまたは本番TiDB クラスターをデプロイに従ってローカル クラスターを作成します。
サンプル アプリを実行して TiDB に接続する
このセクションでは、サンプル アプリケーション コードを実行して TiDB に接続する方法を説明します。
ステップ 1: サンプル アプリ リポジトリのクローンを作成する
ターミナル ウィンドウで次のコマンドを実行して、サンプル コード リポジトリのクローンを作成します。
git clone https://github.com/tidb-samples/tidb-ruby-rails-quickstart.git
cd tidb-ruby-rails-quickstart
ステップ 2: 依存関係をインストールする
次のコマンドを実行して、サンプル アプリに必要なパッケージ ( mysql2
とdotenv
を含む) をインストールします。
bundle install
既存のプロジェクトの依存関係をインストールする
既存のプロジェクトの場合は、次のコマンドを実行してパッケージをインストールします。
bundle add mysql2 dotenv
ステップ 3: 接続情報を構成する
選択した TiDB デプロイメント オプションに応じて、TiDB クラスターに接続します。
- TiDB Serverless
- TiDB Dedicated
- TiDB Self-Hosted
クラスターページに移動し、ターゲット クラスターの名前をクリックして、その概要ページに移動します。
右上隅にある「接続」をクリックします。接続ダイアログが表示されます。
接続ダイアログで、 [接続先]ドロップダウン リストから
Rails
を選択し、エンドポイント タイプのデフォルト設定をPublic
のままにします。パスワードをまだ設定していない場合は、 「パスワードの生成」をクリックしてランダムなパスワードを生成します。
次のコマンドを実行して
.env.example
をコピーし、名前を.env
に変更します。cp .env.example .env.env
ファイルを編集し、DATABASE_URL
環境変数を次のように設定し、接続ダイアログから接続文字列を変数値としてコピーします。DATABASE_URL=mysql2://<user>:<password>@<host>:<port>/<database_name>?ssl_mode=verify_identity注記
TiDB サーバーレスの場合、パブリック エンドポイントを使用する場合は、TLS 接続を
ssl_mode=verify_identity
クエリ パラメーターで有効にする必要があります。.env
ファイルを保存します。
クラスターページに移動し、ターゲット クラスターの名前をクリックして、その概要ページに移動します。
右上隅にある「接続」をクリックします。接続ダイアログが表示されます。
「どこからでもアクセスを許可」をクリックし、 「TiDB クラスター CA のダウンロード」をクリックして CA 証明書をダウンロードします。
接続文字列の取得方法の詳細については、 TiDB専用標準接続を参照してください。
次のコマンドを実行して
.env.example
をコピーし、名前を.env
に変更します。cp .env.example .env.env
ファイルを編集し、次のようにDATABASE_URL
環境変数を設定し、接続ダイアログから接続文字列を変数値としてコピーし、sslca
クエリ パラメータを接続ダイアログからダウンロードした CA 証明書のファイル パスに設定します。DATABASE_URL=mysql2://<user>:<password>@<host>:<port>/<database>?ssl_mode=verify_identity&sslca=/path/to/ca.pem注記
パブリック エンドポイントを使用して TiDB Dended に接続する場合は、TLS 接続を有効にすることをお勧めします。
TLS 接続を有効にするには、
ssl_mode
クエリ パラメータの値をverify_identity
に変更し、sslca
の値を接続ダイアログからダウンロードした CA 証明書のファイル パスに変更します。.env
ファイルを保存します。
次のコマンドを実行して
.env.example
をコピーし、名前を.env
に変更します。cp .env.example .env.env
ファイルを編集し、次のようにDATABASE_URL
環境変数を設定し、<user>
、<password>
、<host>
、<port>
、および<database>
独自の TiDB 接続情報に置き換えます。DATABASE_URL=mysql2://<user>:<password>@<host>:<port>/<database>TiDB をローカルで実行している場合、デフォルトのホスト アドレスは
127.0.0.1
で、パスワードは空です。.env
ファイルを保存します。
ステップ 4: コードを実行して結果を確認する
データベースとテーブルを作成します。
bundle exec rails db:create bundle exec rails db:migrateサンプル データをシードします。
bundle exec rails db:seed次のコマンドを実行してサンプル コードを実行します。
bundle exec rails runner ./quickstart.rb
接続が成功すると、コンソールには次のように TiDB クラスターのバージョンが出力されます。
🔌 Connected to TiDB cluster! (TiDB version: 5.7.25-TiDB-v7.1.3)
⏳ Loading sample game data...
✅ Loaded sample game data.
🆕 Created a new player with ID 12.
ℹ️ Got Player 12: Player { id: 12, coins: 100, goods: 100 }
🔢 Added 50 coins and 50 goods to player 12, updated 1 row.
🚮 Deleted 1 player data.
サンプルコードスニペット
次のサンプル コード スニペットを参照して、独自のアプリケーション開発を完了できます。
完全なサンプル コードとその実行方法については、 tidb-samples/tidb-ruby-rails-quickstartリポジトリを確認してください。
接続オプションを使用して TiDB に接続する
config/database.yml
の次のコードは、環境変数で定義されたオプションを使用して TiDB への接続を確立します。
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
url: <%= ENV["DATABASE_URL"] %>
development:
<<: *default
test:
<<: *default
database: quickstart_test
production:
<<: *default
注記
TiDB サーバーレスの場合、パブリック エンドポイントを使用するときに
ssl_mode
クエリ パラメーターをverify_identity
inDATABASE_URL
に設定することで TLS 接続を有効にする必要がありますが、mysql2 gem は既存の CA 証明書を検索するため、DATABASE_URL
介して SSL CA 証明書を指定する必要はありません。ファイルが検出されるまでの特定の順序。
データの挿入
次のクエリは、2 つのフィールドを持つ単一のプレーヤーを作成し、作成されたPlayer
オブジェクトを返します。
new_player = Player.create!(coins: 100, goods: 100)
詳細については、 データの挿入を参照してください。
クエリデータ
次のクエリは、ID によって特定のプレーヤーのレコードを返します。
player = Player.find_by(id: new_player.id)
詳細については、 クエリデータを参照してください。
データを更新する
次のクエリはPlayer
オブジェクトを更新します。
player.update(coins: 50, goods: 50)
詳細については、 データを更新するを参照してください。
データの削除
次のクエリはPlayer
オブジェクトを削除します。
player.destroy
詳細については、 データの削除を参照してください。
ベストプラクティス
デフォルトでは、mysql2 gem (TiDB に接続するために ActiveRecord ORM によって使用される) は、ファイルが検出されるまで特定の順序で既存の CA 証明書を検索します。
- /etc/ssl/certs/ca-certificates.crt # Debian / Ubuntu / Gentoo / Arch / Slackware
- /etc/pki/tls/certs/ca-bundle.crt # RedHat / Fedora / CentOS / Mageia / Vercel / Netlify
- /etc/ssl/ca-bundle.pem # OpenSUSE
- /etc/ssl/cert.pem # MacOS / Alpine (Docker コンテナ)
CA 証明書のパスを手動で指定することは可能ですが、異なるマシンや環境では CA 証明書が異なる場所に保存される可能性があるため、この方法では複数環境の展開シナリオで大きな不便が生じる可能性があります。したがって、さまざまな環境間での導入の柔軟性と容易さを考慮して、 sslca
~ nil
を設定することをお勧めします。
次のステップ
- ActiveRecord ORM の詳しい使い方をActiveRecord のドキュメントから学びましょう。
- TiDB アプリケーション開発のベスト プラクティスについては、 開発者ガイドの章 ( データの挿入 、 データを更新する 、 データの削除 、 クエリデータ 、 取引 、 SQLパフォーマンスの最適化など) で学習してください。
- プロフェッショナルとしてTiDB 開発者コースを学び、試験合格後にTiDB 認定獲得します。
助けが必要?
質問は不和チャンネルでお願いします。