Rust Diesel Transaction内で外部APIを呼び出す方法

DieselとはRust製のORMです。

Dieselを使ってTransaction内で外部のAPIを叩きたい。
その際に、特定のレコードは行ロックしておきたい。
その戻り値を使ってレコードを更新したい。

今回はその方法を書き溜め。
DieselのTransaction内はsyncのためawaitは使用できない。

reqwestを使うとした場合、blocking::Clientを使用する必要がある。
しかし、ActixWebを利用している場合では、そのままblockingを実行しようとするとコンパイルエラーになる。

async関数の中でtransactionを呼び出すことになるため、
色々試してみてたところRuntime Handleからspawn_blockingすることで対応可能だった。

handle.spawn_blocking(move || のところがポイントだと理解した。

tokioはversion 0.2, reqwestは0.1, dieselは1.4.4です。



Rust勉強しなきゃ...
じゃあね〜〜〜〜。