database.yml の query_log_tags のネストキー参照バグを修正

rails/rails

この PR は、database.yml に記述した query_log_tags の内部キー(formatprepend_comment)が正しく読み取られず、設定が無効になる問題を解消します。HashConfig がトップレベルキーのみをシンボル化する仕様に起因し、ネストされたハッシュは文字列キーで保持されているため、シンボルでアクセスすると nil になる点を修正します。

背景

query_log_tags のネストキーが無視されるバグ が発生していたのは、HashConfig が初期化時に @configuration_hash = configuration_hash.symbolize_keys.freeze としてトップレベルキーだけをシンボル化したためです。その結果、query_log_tags 配下の formatprepend_comment は文字列キーのまま残り、従来コードの config[:format] などのシンボル参照では取得できませんでした。この不一致により、データベースプール単位でのクエリログタグ設定がグローバル設定にフォールバックしてしまい、意図したタグ付与が行われませんでした。修正により、YAML で記述した通りのタグ設定が各プールで有効になります。

技術的な変更

HashConfig の内部アクセスを文字列キーに置き換え ました。query_log_tags_formatquery_log_tags_prepend_comment メソッドで、シンボル :format / :prepend_comment の代わりに文字列キー "format" / "prepend_comment" を使用し、ハッシュが存在すればその値を取得するよう変更しています。

@@ -113,14 +113,14 @@ def query_log_tags_format # :nodoc:
         return @query_log_tags_format if defined? @query_log_tags_format

         config = query_log_tags_config
-        @query_log_tags_format = (config[:format]&.to_sym if config.is_a?(Hash))
+        @query_log_tags_format = (config["format"]&.to_sym if config.is_a?(Hash))
       end

       def query_log_tags_prepend_comment # :nodoc:
         return @query_log_tags_prepend_comment if defined? @query_log_tags_prepend_comment

         config = query_log_tags_config
-        @query_log_tags_prepend_comment = (config[:prepend_comment] if config.is_a?(Hash))
+        @query_log_tags_prepend_comment = (config["prepend_comment"] if config.is_a?(Hash))
       end

テストコードも YAML 文字列での設定に合わせて更新 しています。with_db_config 呼び出しをハッシュリテラルからインライン YAML に置き換え、format: sqlcommenterprepend_comment: true が文字列キーとして渡されることを検証しています。これにより、実際の database.yml と同様の読み取り挙動がテストで保証されます。

-    with_db_config(query_log_tags: { format: "sqlcommenter" }) do |connection|
+    with_db_config(<<~YAML) do |connection|
+      query_log_tags:
+        format: sqlcommenter
+    YAML

設計判断

トップレベルのシンボル化は維持し、ネストキーのみ文字列参照へ変更 する方針が採用されました。HashConfig 全体のキー変換ロジックを変更すると、既存の設定ファイルやプラグインとの互換性リスクが高まります。一方、該当メソッドだけを文字列キーで取得するようにすれば、既存の読み取りロジックや他の設定項目への影響はありません。この最小限の変更でバグを解消し、将来的にキー変換方針を統一する余地を残した設計です。

まとめ

database.ymlquery_log_tags 設定が正しく反映されるように、HashConfig がネストキーを文字列で参照するよう修正しました。コード変更は限定的で後方互換性を保持しつつ、プール単位のタグ付与機能を期待通りに動作させます。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
a3815111

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文、背景、技術的変更、設計判断(任意)、まとめの構成が揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックは正しい形式(言語:ファイルパス)で記載されているが、PRリンクの記法が「[PR #57778](URL)」となっており、仕様の "[#57778](URL)" とは異なります。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

エンジニア向けの専門的な内容で、初心者向けの余計な説明はなく適切です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論・各論・結論の段落で構成され、トピックセンテンスで始まり、1段落1トピック、長さも適切で空行で区切られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードスニペットは提供されたDiffと一致しており、ファイル名も正しく示されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

HashConfig、query_log_tags、YAML などの用語は PR 内容と合致しており、誤用はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

バグの原因と修正内容の説明が PR の記述と矛盾せず、技術的に正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事の主張はすべて PR タイトル、説明、Diff で裏付けられており、捏造や推測はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR 番号 #57778 などの数値は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR の内容「Fix configuring query_log_tags in database.yml」を日本語で適切に表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

バージョンサポートやリリース日程等、PR に含まれない外部知識は記載されていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現に関する記述はなく、PR と齟齬はありません。