$ cat dune (executable (name user) (libraries lwt caqti-lwt.unix caqti-driver-sqlite3 petrol) (preprocess (pps lwt_ppx))) $ cat user.ml open Petrol open Petrol.Sqlite3 let version = VersionedSchema.version [ 1; 0; 0 ] let schema = VersionedSchema.init version ~name:"user" module User = struct let table, Expr.[ _id; username; password; is_admin ] = VersionedSchema.declare_table schema ~name:"user" Schema. [ field ~constraints:[ primary_key ~auto_increment:true () ] "id" ~ty:Type.int; field "username" ~ty:Type.text; field "password" ~ty:Type.text; field "is_admin" ~ty:Type.bool; ] let insert (conn : Caqti_lwt.connection) ~username:username' ~password:password' ~is_admin:is_admin' = Query.insert ~table ~values: Expr. [ username := s username'; password := s password'; is_admin := bl is_admin'; ] |> Request.make_zero |> Petrol.exec conn end let main = let uri_str = "sqlite3:./test-db.sqlite" in let uri = Uri.of_string uri_str in match%lwt Caqti_lwt_unix.connect uri with | Error _ -> Lwt.return () | Ok conn -> match%lwt Petrol.VersionedSchema.initialise schema conn with | Error _ -> Lwt.return () | Ok () -> User.insert conn ~username:"admin" ~password:"s3cr3t" ~is_admin:true |> Lwt.map ignore let () = Lwt_main.run main $ dune exec ./user.exe Fatal error: exception Failure("wrapped value list did not conform to specification - expected BOOLEAN got BOOLEAN") $ echo '.schema' | sqlite3 ./test-db.sqlite CREATE TABLE petrol_user_version_db (version TEXT PRIMARY KEY NOT NULL); CREATE TABLE user (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT, is_admin BOOLEAN); CREATE TABLE sqlite_sequence(name,seq); $ echo 'select * from user;' | sqlite3 ./test-db.sqlite # nothing...