MySQLの`strict`設定オプションを非推奨化

rails/rails

ActiveRecordのMySQL設定におけるstrictオプションが非推奨となり、variables: { sql_mode: "..." }による直接指定への移行が推奨されます。この変更により、Rails 8.3での同オプションの完全削除に向けた移行パスが明示されます。

背景

strictオプションはRails 4.2で導入され、MySQLのsql_modeを制御する手段として機能してきました。具体的には、strict: true(デフォルト)でSTRICT_ALL_TABLESを有効化し、strict: falseでこれを無効化、strict: :defaultでグローバル設定に委ねるという挙動を提供していました。

しかし同じ制御はvariables: { sql_mode: "..." }を使って直接sql_modeを指定することで実現可能です。strictオプションはいわば抽象化レイヤーとして機能してきましたが、その必要性は薄れていました。CHANGELOGには「2026年時点でMySQLを非strictモードで動かす推奨はない」と記載されており、オプション自体の存在意義が問われる状況となっていました。

こうした背景から、strictオプションは冗長な設定インターフェースと判断され、非推奨化の対象となりました。

技術的な変更

非推奨警告はabstract_mysql_adapter.rbstrict_mode?メソッド内に実装されました。接続設定にstrictキーが存在する場合に警告を発する形です。

変更後:

def strict_mode?
  if @config.key?(:strict) && !@strict_mode_deprecation_warned
    @strict_mode_deprecation_warned = true
    ActiveRecord.deprecator.warn(<<~MSG.squish)
      The `strict` option in database configurations is deprecated and
      will be removed in Rails 8.3. Use `variables: { sql_mode: "..." }`
      to configure sql_mode directly instead.
    MSG
  end

  self.class.type_cast_config_to_boolean(@config.fetch(:strict, true))
end

@strict_mode_deprecation_warnedフラグにより、同一接続インスタンスで警告が重複して出力されることを防いでいます。警告発火後も既存のtype_cast_config_to_booleanによる動作は維持されるため、非推奨化はふるまいの変更を伴いません。

テストコードでは、strictオプションを使用している2つのテストケースがassert_deprecatedブロックで囲まれ、警告の発生が明示的に検証されるようになりました。またdefaults_test.rb内のヘルパーメソッドusing_strictActiveRecord.deprecator.silenceブロックで囲まれ、テスト実行時に不要な警告が出力されないよう配慮されています。

移行先の対応関係は以下のとおりです:

  • strict: true → 削除(デフォルト動作)
  • strict: falsevariables: { sql_mode: "" }
  • strict: :defaultvariables: { sql_mode: :default }

設計判断

非推奨化の手法として、動作を変えずに警告のみを追加するアプローチが採られています。strict_mode?メソッドの戻り値のロジックには手を加えず、警告の挿入に留めることで、既存アプリケーションへの影響を最小化しています。

@strict_mode_deprecation_warnedフラグの導入は、strict_mode?が接続確立のたびに呼び出される可能性を考慮した実装です。警告の重複出力はログノイズになるため、インスタンス変数で一度だけ警告を出す制御を加えています。

また、Rails 8.3での削除という明確なタイムラインをCHANGELOGと警告メッセージの双方に記載することで、利用者が移行計画を立てやすくしています。

まとめ

本PRは、Rails 4.2から存在したstrictオプションに非推奨のラベルを付け、より直接的なsql_mode設定への移行を促す変更です。variables: { sql_mode: "..." }という一貫したインターフェースにMySQL設定を統一することで、抽象化レイヤーとしてのstrictオプションが果たしてきた役割を標準的な設定手段に置き換えます。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
7c728ed5

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)→各論(背景、技術的変更、設計判断)→まとめ(結論)という3部構成が明確に適用されており、非常に分かりやすい構成です。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きのシンタックスハイライト(```ruby:filepath)およびPR番号のリンク記法([PR #57077](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

ActiveRecordやsql_modeなどの専門用語を前提としており、対象読者であるエンジニアに適した技術レベルと表現で書かれています。

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

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

各セクション、各パラグラフが「総論→各論」の構造で書かれています。特に各段落の1文目がトピックセンテンスとして機能しており、可読性が非常に高いです。

Diff内容との照合 ✓ PASS

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

記事に引用されている`abstract_mysql_adapter.rb`のコードは、提供されたDiffの内容と完全に一致しており、正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「deprecator」「strict_mode?」「sql_mode」といった技術用語が、PRの文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

非推奨化の警告が追加されただけで既存の動作は変更されない点や、テストコードの修正内容に関する説明が、Diffの内容と一致しており技術的に正確です。

事実の突合 ⚠ WARNING

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

「2026年時点でMySQLを非strictモードで動かす推奨はない」という記述の出典を「CHANGELOG」としていますが、この事実はPRのDescriptionに記載されているものであり、CHANGELOGの差分には含まれていません。事実の帰属元が不正確です。

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

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

PR番号(#57077)、バージョン番号(Rails 4.2, 8.3)などの数値や固有名詞はすべて正確に記載されています。

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

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

記事タイトル「MySQLの`strict`設定オプションを非推奨化」は、PRのタイトル「Deprecate the `strict` option in MySQL database configurations」の内容を正確に反映しています。

外部知識の正確性 ✓ PASS

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

記事に含まれる「Rails 4.2」「Rails 8.3」「2026年」といった情報は、すべてPR情報内に記載されており、PRにない外部知識の追記はありません。

時間表現の正確性 ✓ PASS

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

「非推奨化」「Rails 8.3で削除予定」といった時間表現は、PRで示されている現在の状態と将来の計画を正確に反映しています。