I propose the following tutorial
https://www.sinerj.org/~loyer/caqti_ppx_rapper/caqti_ppx_rapper/index.html
It is about Caqti and ppx_rapper use. The tutorial also uses the Lwt_result monad and its (let*) binding operator. This avoid any explicit error handling.
I hope this will be interesting, and will be glad to get some advice to improve this first copy.
Perhaps I should add a section about processing a list of queries (ex: a query returns a list of item and we want to execute a new query for each row)