16
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ソニックガーデン 若手プログラマAdvent Calendar 2024

Day 1

【Rails】database.ymlのadapter:を指定した内部動作を理解する

Last updated at Posted at 2024-12-01

こちらの記事はソニックガーデン 若手プログラマ Advent Calendar 2024の1日目の記事です。

若手のトップバッターとして、ふわっとしか理解していなかったアダプターについて書きました。

はじめに

Ruby on Railsで開発を行う際に、database.ymlに設定するアダプター(adapter:)について、どれほど理解していますか?

database.yml
default: &default
  adapter: postgresql
  ...

こちらのようにadapter:を指定するだけで、Railsが自動的にSQLを発行してくれる仕組みが気になり、内部で何が起こっているのか調べてみました。

この記事では、以下の内容について解説します。

  • adapter:を指定すると、内部で何が変わるのか
  • pgmysql2といったgemがどのタイミングで使われるのか

そもそも Active Record とは

Active Recordは、Ruby on Railsにおけるオブジェクトリレーショナルマッピング(ORM)システムです。これにより、データベースのテーブルをRubyのオブジェクトとして操作でき、SQLを直接書かずにデータベース操作を行うことが可能になります。

Railsを使って開発している場合、以下のようなイメージでActive Recordを利用していると思います。

スクリーンショット 2024-12-01 8.39.51.png

「ActiveRecordのコードからいい感じでSQLを発行してくれてるんだな」ぐらいのイメージでいる方もいらっしゃるかと思います。

adapter:を指定すると内部的に何が変わるのか

では、database.ymlで指定するadapter:が何を意味するのか、詳しく見ていきましょう。

Active Recordのアダプターは、異なるデータベースエンジン(PostgreSQL、MySQLなど)間での差異を吸収し、共通のインターフェースを提供します。これにより、データベースを切り替えても、アプリケーションコードをほとんど変更せずに済みます。

例えば、database.ymlに以下のようにadapter: postgresqlを設定すると、RailsはActiveRecord::ConnectionAdapters::PostgreSQLAdapterを使用して、PostgreSQLとの接続やSQLの発行を行います。

database.yml
adapter: postgresql

このように、データベースエンジンに適切なアダプターを指定することで、Railsはそのデータベースに合わせた処理を自動的に行います。もしMySQLを使用する場合は、adapter: mysql2を指定すれば、ActiveRecord::ConnectionAdapters::Mysql2Adapterが使われます。

以下は、アダプターのイメージ図です。

スクリーンショット 2024-11-30 17.48.18.png

アダプターは、異なるデータベースを使用してもActive Recordが一貫した動作をするための役割を担っています。

pgmysql2はどこで使われるのか

次に、pgmysql2などのgemが、実際にどこで使われるのかについて見ていきましょう。

例えば、ActiveRecord::ConnectionAdapters::PostgreSQLAdapterは、内部でpg gemを利用してPostgreSQLとの接続を行います。以下は、postgresql_adapter.rbの一部です。

postgresql_adapter.rb
require "pg"
...

def connect
  @raw_connection = self.class.new_client(@connection_parameters)
  ...
end

def new_client(conn_params)
  PG.connect(**conn_params)
  ...
end

require "pg"によってpg gemが読み込まれ、new_clientメソッド内でPG.connectが呼ばれることで、PostgreSQLとの接続が確立されます。PG.connectPG::ConnectionというPostgresSQL接続のクラスをnewする役割を果たしています。この接続が、RailsアプリケーションからPostgreSQLに対するクエリを発行できるようにします。

以下の図で、pg gemがどのように使用されるかのイメージを示します。

スクリーンショット 2024-11-30 18.02.54.png

結論

  • database.ymlで指定するadapter:に応じて、Railsは異なるアダプタークラス(PostgreSQLAdapterMysql2Adapter)を使用する
  • アダプタークラス内では、対応するgem(pgmysql2)がrequireされ、実際のデータベースとの接続が確立される

アダプターによってRailsは異なるデータベースエンジンを抽象化し、アプリケーションコードを変更することなく、さまざまなデータベースに対応できるようなるということが分かりました。

この記事を読んでくれた方も、Railsがよしなにやっている部分のコード見てみても面白いかもしれません…!

参考文献

この記事を書く上でどのあたりのコードを読んだのか参考になれば幸いです。

16
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?