16
63%
BSD-2-Clause
bs-knex
3.1.0
BuckleScript interface to the node 'knex' library

bs-knex

version downloads license

BuckleScript utilities for working with the Node knex library.

Getting Started

To start working with Knex, first define a config:

  • RE
  • ML
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:

  • RE
  • ML
let knex = Knex.make(config);
let knex = Knex.make config

You can now try a raw query to verify the connection:

  • RE
  • ML
knex |> Knex.raw("select now()")
let _ = knex |> (Knex.raw "select now()")

Querying

Use the query builder to structure your request for the database:

  • RE
  • ML
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:

  • RE
  • ML
|> 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:

  • RE
  • ML
|> then_(rejectIfEmpty(~error="Unable to update User with id: " ++ id))
0: <UNKNOWN SYNTAX ERROR>

Handle specific unique violations with the handleUniqueError utility:

  • RE
  • ML
|> 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:

  • RE
  • ML
|> 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.

License

BSD 2-Clause