MySQLの`strict`設定オプションを非推奨化
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.rbのstrict_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_strictはActiveRecord.deprecator.silenceブロックで囲まれ、テスト実行時に不要な警告が出力されないよう配慮されています。
移行先の対応関係は以下のとおりです:
-
strict: true→ 削除(デフォルト動作) -
strict: false→variables: { sql_mode: "" } -
strict: :default→variables: { 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オプションが果たしてきた役割を標準的な設定手段に置き換えます。