BuckleScript utilities for working with the Node knex library.
To start working with Knex, first define a config:
let (to_opt, getWithDefault) = (Js.Nullable.to_opt, Js.Option.getWithDefault);
let connection =
KnexConfig.Connection.make(
~user=Config.Database.username,
~password=Config.Database.password,
~host=Config.Database.hostname,
~port=Config.Database.port,
~database=Config.Database.name,
()
);
let pool =
KnexConfig.Pool.make(
~min=Config.Database.poolMin,
~max=Config.Database.poolMax,
~idleTimeoutMillis=Config.Database.poolIdle,
()
);
let config =
KnexConfig.make(~client="pg", ~connection, ~pool, ~acquireConnectionTimeout=2000, ());
let (to_opt,getWithDefault) = (Js.Nullable.to_opt, Js.Option.getWithDefault)
let connection =
KnexConfig.Connection.make ~user:Config.Database.username
~password:Config.Database.password ~host:Config.Database.hostname
~port:Config.Database.port ~database:Config.Database.name ()
let pool =
KnexConfig.Pool.make ~min:Config.Database.poolMin
~max:Config.Database.poolMax ~idleTimeoutMillis:Config.Database.poolIdle
()
let config =
KnexConfig.make ~client:"pg" ~connection ~pool
~acquireConnectionTimeout:2000 ()
Then you can initialize a client:
let knex = Knex.make(config);
let knex = Knex.make config
You can now try a raw query to verify the connection:
knex |> Knex.raw("select now()")
let _ = knex |> (Knex.raw "select now()")
Use the query builder to structure your request for the database:
Knex.(
knex
|> fromTable("users")
|> where({"id": id})
|> update({"first_name": firstName})
)
let _ =
let open Knex in
((knex |> (fromTable "users")) |> (where ([%bs.obj { id }]))) |>
(update ([%bs.obj { first_name = firstName }]))
When you're ready to wait for results, call toPromise
:
|> then_(
(results) =>
switch results {
/* No user found, so resolve with None to signal onboarding */
| [||] => resolve(None)
| users => resolve(Some(users[0]))
}
)
0: <UNKNOWN SYNTAX ERROR>
Handle empty results with the rejectIfAny
handler:
|> then_(rejectIfEmpty(~error="Unable to update User with id: " ++ id))
0: <UNKNOWN SYNTAX ERROR>
Handle specific unique violations with the handleUniqueError
utility:
|> KnexUtils.handleUniqueError(
~name="users_email_unique",
~message="That email address is already in use."
)
|> KnexUtils.handleUniqueError(
~name="users_user_name_unique",
~message="That user name is already in use."
)
0: <UNKNOWN SYNTAX ERROR>
Finish off your operation by handling any remaining generic database errors with KnexUtils
:
|> KnexUtils.handleDbErrors
0: <UNKNOWN SYNTAX ERROR>
This handles a some common database error cases, which will hopefully grow over time as the library becomes more mature.