1. tanaken on Rails
  2. #011: Scheme#key_provider, b..
2024-03-16 13:35

#011: Scheme#key_provider, build_insert_sql for MySQL

サマリー

「tanaken on Rails」の第11回エピソードでは、RailsWorld2024のスピーカー募集のお知らせやRails Guideの修正プルリクエストなどが紹介されています。また、Active Recordの変更に関する2つのプルリクエストがあります。高速化の処理とMySQLの特定のバージョンで発生していたエラーの修正が行われています。

お知らせとプルリクエスト紹介
こんにちは、tanakenです。第11回の tanaken on Rails始めます。今週の
This Week in Railsでは、2つのお知らせと 2つのプルリクエストを紹介したい
と思います。お知らせの1つ目。こちら は先週に引き続き、RailsWorld2024
に関するお知らせですね。リマインド って感じです。3月21日がスピーカー
の応募締め記念なので、みなさん 応募してねというお知らせでございます。
続いてお知らせの2点目。これは プルリクエストでもあるんだけども、
Rails GuideのActive Record Basicsという ページが内容が変更されてます
というプルリクエストですね。これ 実際にはまだ、Rails Guideには反映
はまだ現時点ではされてなかったん ですけど、プルリクエストとしては
Active Recordの基本的な基本事項について の説明のところですね。いろいろ
と文面が変わったりとか、サンプル コードが変わったりとかっていう
プルリクエストでございます。先週 はActive Recordクエリガイドだった
かなっていうページについてのアイデア 下さいっていう話だったんですけど、
今回はまた違うページですね。Active Record Basicsというページのもう修正
が実際に入ってると。これ追いかけて ないんですけど、もしかしたらこれも
過去に一周で変更のアイデアフィードバック 下さいみたいな募集というかそういう
のがあったのかもしれないですね。 多分それに基づいて変更している
という感じで、こうやってRails Guide も徐々に改善がされていってる
ということでありがたいですね。 というのがお知らせの2個目でございました。
Memoise Key Underscore Providerのプルリクエスト
続いてプルリクエストの一つ目。 タイトルがMemoise Key Underscore Provider
From Key or Deterministic Key Underscore Provider If Anyというタイトルのプルリクエストです。
こちらはActive Recordに関する変更です。 このプルリクエストの作者は自身の
RailsアプリケーションをRailsの マスターブランチで動かしてみたら
テストコードの実行におよそ5倍の 時間がかかるようになったと言っていて
その原因を調べてこのプルリクエスト を出したみたいですね。
どこに原因があったのかというのを このプルリクエストで説明しております。
まず前提としてActive Recordコロンコロン エンクリプションコロンコロンスキーマ
というクラスがあります。スキーム かというクラスがあります。
これはRailsにおけるモデルの特定の 属性に暗号化するための仕組みを
提供するというクラスです。この クラスにkey underscore providerという
メソッドがあります。このメソッド に関して2024年2月9日、先月2月9日
に作られたプルリクエストである 変更が行われています。それは
何かというとタイトルがremove memorization to accept key underscore
provider overriddenというプルリクエストです。
overridden by with underscore encryption underscore contextというプルリクエストですね。
もともとこのkey underscore providerという メソッドはインスタンス変数を
使ってメモ化されていました。この 2月9日のプルリクエストではその
インスタンス変数が意図しない タイミングで上書きされる場合が
あるということを指摘してメモ 化の処理をなくすという変更を
しています。今回のプルリクエスト に戻るとこの2月9日のプルリクエスト
の変更が原因でテストの実行に 時間がかかる場合が発生していた
ということが分かったということ ですね。全てのケースじゃないけど
ある特定の場合に時間がかかる ということが分かったよと。具体的
にはモデルの属性に対してキー を明示的に渡す。暗号化のキー
を明示的に渡す。あるいは決定論 的にキープロバイダーを宣言する
場合ということですね。すみません ここは詳しく完全に説明することは
僕の理解ではまだできないんですけど この2つの場合に時間がかかること
があったと。時間かかりますという ふうに言ってますね。この2つの
場合には属性を読み込むたびに 特定の例えばパスワードとか電話
メールアドレスとか分かんない けどそういう暗号化したい属性
を読み込むたびにキーアンダースコア プロバイダーをインスタンス化
するためのキーを導出する必要 があると。なので結果的にActiveSupport
コロンコロンキージェネレーター クラスのGenerateKeyメソッドであったり
オープンSSLコロンコロンKDFクラス のクラスメソッド PBKDF2アンダースコア
HMACというクラスメソッドを何度も 呼び出すことになって これが大きな
オーバーヘッドを発生させるということを このプレリクエストでは指摘
してますと。今回の変更内容として はこのさっきの2つのパターンですね
属性に対してキーを明示的に渡す 場合 あるいは属性のキーアンダースコア
プロバイダーを決定論的に宣言 する場合 この2つについてそれぞれ
インスタンス変数を使ってメモ化 の処理を実装するということを
やってます その結果としてオーバーヘッド が小さくなって処理の高速化が
実現されるということですね なので 過去のプレリクエストで
意図せず重くなっちゃった処理 があったんで それを高速化しました
というのが ざっくりこのプレリクエスト でやっていることですね
MySQL 8.0.19のAliases導入に関するプルリクエスト
最後 プレリクエストの2つ目 タイトル が MySQL 8.0.19 Introduce Aliases in the
Values and Set Causes of Insert into … on Deprecate Key Update Statementという
タイトルです ちょっとうまく伝わった かな 難しいな アクティブレコード
に関する変更です ちょっとタイトル 一周のタイトルじゃない 一周じゃない
プレリクエストのタイトルを和訳 すると MySQL 8.0.19では Insert into
…on Deprecate Key Updateというステートメント に対して バリューズクとセットクに
Aliasesが導入されていますという タイトルのプレリクエストです
そうなんだ じゃあ このプレリクエスト MySQLの機能の説明みたいになって
て じゃあ Railsで何をしたんですか みたいなのは ちょっとタイトル
だけじゃ分かんないんですけど この 8.0.19で便利なAliasesが使える
ようになったよみたいな話がタイトル になってます プレリクの中身
を見ると MySQL 8.0.0から MySQL 8.0.18の間 0から18の間で あるエラーが発生
したので それを修正しています という話なんですよね アクティブ
レコードコロンコロンコネクション アダプターズコロンコロン MySQL
ToAdapterというクラスがありまして この クラスにおいてinsertInto何ちゃら
onDeplicateKeyUpdateStatementっていう のが使われるケースがあって
このステートメントの中でvalues のAliasesを使用する処理っていう
のが実装されています valuesのAliases を使ってこのinsertInto何ちゃら
ステートメントを実行するという 処理が書かれていますと 今回の
プレリクエストの変更の前までは そのvaluesのAliasesを使う処理に
入る条件がMySQL 8.0.0以上であれば 使いますよという処理になって
たんですよね 8.0.0以上だったら このAliasesを使った処理っていう
のを実行しますと なんかこれ インサートオールを使う場合の
テストケースでエラーになりました とかプリクに書いてあったんで
このRailsでMySQLに対してレコード を一気に追加するインサートオール
とかの処理をやる場合の話だと思 うんですけど 8.0.0以上であれば
このvaluesAliasesっていうのを使って クエリを組み立てるっていうのを
実装されてたんですね だけれども 実際にこのAliasesを使えるのは
8.0.19以降だよと つまり8.0.0だと まだ使えないよと 8.0.18でもまだ
使えないよと 19から使えるんだよ というので その処理に入る条件
分岐の今8.0.0って書かれてたところ を8.0.19に書き換えたよと あと
プラスアルファでコードコメント がいくつか書かれてるんですけど
簡単に言うと 実際の修正として は一応8.0.0を8.0.19に書き換えた
だけという修正になってます つまり 8.0.0から18までの間は この
分岐に入っちゃってたんで まだ 使えないvaluesAliasesを使っちゃって
エラーになってるっていうこと だったようですね なので今回の
修正で8.0.0とか8.0.18とかでも エラーにならずにこのvaluesAliases
を使わないほうの処理の分岐に 入ってうまく動くので エラーが
解消されてよかったねと 8.0.19以上 だとこのvaluesAliasesを使って
エクエリを実行するんで いいですよ ねという感じですね
コードコメントに書かれてたのが 8.0.20になるとvaluesAliasesじゃなくて
古いほうの処理が使えなくなるよ みたいな 非推奨になるか もともと
valuesAliasesじゃなくて valuesっていう クエリを使ってるんですけど
それが非推奨になって いつか 消えるんだろうなきっと 8.0.21
以降なのかvaluesっていうのは 使えなくなって valuesAliasesを使って
くださいねっていうのが標準になって いくということみたいですね
どうやら といったような コードコメントも書いてありました
という感じですね 以上となります まとめるとお知らせ2件
RailsWorld 2024のスピーカー募集の話と RailsGuideのActive Record Basicsが
更新されていきますよという話 あとはプレリクエストは
アクティブレコードに関して2件 暗号化キーのキープロバイダーの
エラーの修正
高速化の処理と MySQLの特定のバージョン で発生していたエラーの修正が
行われていますというお話をしました では こんなところで 今週の
田中絵音Rails 終わりにしたいと思います では また来週 バイバイ
13:35

コメント

スクロール