📣
TiDB Cloud Premium はパブリックプレビュー中です。エンタープライズワークロード向けの無制限のスケーリング、即時の弾力性、高度なセキュリティを提供します。このページは自動翻訳されたものです。原文はこちらからご覧ください。

RailsフレームワークとActiveRecord ORMを使用してTiDBに接続する



TiDBはMySQL互換のデータベースであり、 Rails Rubyで書かれた人気のWebアプリケーションフレームワークであり、 ActiveRecord ORMはRailsにおけるオブジェクトリレーショナルマッピングです。

このチュートリアルでは、TiDBとRailsを使用して以下のタスクを実行する方法を学ぶことができます。

  • 環境をセットアップしてください。
  • Railsを使用してTiDBに接続します。
  • アプリケーションをビルドして実行します。オプションで、ActiveRecord ORM を使用した基本的な CRUD 操作用のサンプルコードスニペットを見つけることができます。

前提条件

このチュートリアルを完了するには、以下が必要です。

  • Ruby>= 3.0 がマシンにインストールされている
  • あなたのマシンにインストールされているBundler
  • お使いのマシンにGitがインストールされています
  • 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に接続してください。

    1. My TiDBページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。

    2. 右上隅のConnectをクリックしてください。接続ダイアログが表示されます。

    3. 接続ダイアログで、Connect WithドロップダウンリストからRailsを選択し、 Connection Typeのデフォルト設定をPublicのままにします。

    4. まだパスワードを設定していない場合は、 Generate Passwordをクリックしてランダムなパスワードを生成してください。

    5. .env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。

      cp .env.example .env
    6. .envファイルを編集し、 DATABASE_URL環境変数を次のように設定し、接続ダイアログから接続文字列をコピーして変数の値として使用します。

      DATABASE_URL='mysql2://{user}:{password}@{host}:{port}/{database_name}?ssl_mode=verify_identity'
    7. .envファイルを保存します。

    1. My TiDBページに移動し、対象のTiDB Cloud Premiumインスタンスの名前をクリックして概要ページに移動します。

    2. 左側のナビゲーションペインで、 Settings > Networkingをクリックします。

    3. Networkingページで、Public EndpointEnableをクリックし、次にAdd IP Addressをクリックします。

      クライアントのIPアドレスがアクセスリストに追加されていることを確認してください。

    4. 左側のナビゲーションペインでOverviewをクリックすると、インスタンスの概要ページに戻ります。

    5. 右上隅のConnectをクリックしてください。接続ダイアログが表示されます。

    6. 接続ダイアログで、 Connection TypeドロップダウンリストからPublicを選択します。

      • 公開エンドポイントがまだ有効化中であることを示すメッセージが表示された場合は、処理が完了するまでお待ちください。
      • まだパスワードを設定していない場合は、ダイアログのSet Root Passwordをクリックしてください。
      • サーバー証明書を確認する必要がある場合、または接続に失敗して認証局(CA)証明書が必要な場合は、 CA certをクリックしてダウンロードしてください。
      • Public接続タイプに加えて、 TiDB Cloud Premium はPrivate Endpoint接続をサポートします。詳細については、 AWS PrivateLink経由でTiDB Cloud Premiumに接続しますを参照してください。
    7. .env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。

      cp .env.example .env
    8. .envファイルを編集し、 DATABASE_URL環境変数を以下のように設定し、接続ダイアログで対応するプレースホルダー{}接続パラメータに置き換えます。

      DATABASE_URL='mysql2://{user}:{password}@{host}:{port}/{database_name}'
    9. .envファイルを保存します。

    1. My TiDBページに移動し、対象のTiDB Cloud Dedicatedクラスタの名前をクリックして概要ページに移動します。

    2. 右上隅のConnectをクリックしてください。接続ダイアログが表示されます。

    3. 接続ダイアログで、 Connection TypeドロップダウンリストからPublicを選択し、 CA certをクリックしてCA証明書をダウンロードします。

      IP アクセス リストを設定していない場合は、最初の接続の前に、 Configure IP Access Listをクリックするか、IP アクセス リストを設定するの手順に従って設定します。

      TiDB Cloud Dedicated は、Public接続タイプに加えて、Private EndpointおよびVPC Peering接続タイプもサポートしています。詳細については、 TiDB Cloud Dedicatedクラスタに接続しますを参照してください。

    4. .env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。

      cp .env.example .env
    5. .envファイルを編集し、 DATABASE_URL環境変数を次のように設定し、接続ダイアログから接続文字列をコピーして変数の値として設定し、 sslcaクエリパラメータを接続ダイアログからダウンロードした CA 証明書のファイルパスに設定します。

      DATABASE_URL='mysql2://{user}:{password}@{host}:{port}/{database}?ssl_mode=verify_identity&sslca=/path/to/ca.pem'
    6. .envファイルを保存します。

    1. .env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。

      cp .env.example .env
    2. .envファイルを編集し、 DATABASE_URL環境変数を次のように設定し、 {user}{password}{host}{port} 、および{database}独自の TiDB 接続情報に置き換えてください。

      DATABASE_URL='mysql2://{user}:{password}@{host}:{port}/{database}'

      TiDBをローカルで実行している場合、デフォルトのホストアドレスは127.0.0.1で、パスワードは空です。

    3. .envファイルを保存します。

    ステップ4:コードを実行して結果を確認する

    1. データベースとテーブルを作成します。

      bundle exec rails db:create bundle exec rails db:migrate
    2. サンプルデータにシード値を設定します。

      bundle exec rails db:seed
    3. サンプルコードを実行するには、以下のコマンドを実行してください。

      bundle exec rails runner ./quickstart.rb

    接続が成功すると、コンソールには次のようにTiDBのバージョンが出力されます。

    🔌 Connected to TiDB cluster! (TiDB version: 8.0.11-TiDB-v8.5.4) ⏳ 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

    データを挿入する

    次のクエリは、2つのフィールドを持つ単一の Player オブジェクトを作成し、作成された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(ActiveRecord ORMがTiDBに接続するために使用)は、ファイルが見つかるまで特定の順序で既存のCA証明書を検索します。

    1. /etc/ssl/certs/ca-certificates.crt # Debian / Ubuntu / Gentoo / Arch / Slackware
    2. /etc/pki/tls/certs/ca-bundle.crt # RedHat / Fedora / CentOS / Mageia / Vercel / Netlify
    3. /etc/ssl/ca-bundle.pem # OpenSUSE
    4. /etc/ssl/cert.pem # MacOS / Alpine (Dockerコンテナ)

    CA証明書のパスを手動で指定することも可能ですが、異なるマシンや環境によってCA証明書の保存場所が異なる場合があるため、複数の環境にデプロイするシナリオでは、この方法は大きな不便をもたらす可能性があります。そのため、 sslcanilに設定することで、柔軟性と異なる環境へのデプロイの容易性を確保できます。

    次のステップ

    お困りですか?

    このページは役に立ちましたか?