Konjection - ORM Helper using Knex and Objection

Alex Merced - Nov 16 '20 - - Dev Community

Konjection Tutorial Video: https://youtu.be/zfp7D_MB9c0

What is Konjection?

Konjection is a helper Library built on top of Knex Query Builder and Objection, so you still have access to the entire API of both these libraries with some time saving helper functions.

Knex Query Builder: A library for using functions to structure queries to your SQL Database

Objection: An ORM built on top of Knex

Setup

  • Create a new folder for your project

-

touch db.js

-

npm init -y

-

npm install konjection

DB Connection

In db.js do the following, if using postgres you don't need to install the pg drivers but if using any other database download the drivers and refer to the Knex documentation on how the config object should look like for the knex property.

const konject = require("konjection");

const dbconfig = {
  knex: {
    client: "pg",
    connection: {
      host: "localhost",
      port: "5432",
      user: "test5",
      password: "test5",
      database: "test5",
    },
  },
};

const [knex, Model, konModel, maker] = konject(dbconfig);

module.exports = {
  knex,
  Model,
  konModel,
  maker
};
Enter fullscreen mode Exit fullscreen mode

What was exported...

  • knex => This is the knex database object that can be used as explain in the knex documentation

  • Model => The Objection Model Class that can be used as explained in the Objection documentation

  • konModel => function that spins up a new model with basic crud functions

  • maker => a wrapper on the knex object to make creating, altering and deleting tables easier, refer to the konjection documentation on how it works. Although if you setup the Knex migrations feature that is probably the ideal way to alter your database.

Creating a Model

assuming you've created the proper tables with the proper fields using the knex migrations feature or the maker function

  • create new files... owners.js and pets.js

pets.js

const {konModel} = require("./db.js")

const Pets = konModel("pets")

module.exports = Pets
Enter fullscreen mode Exit fullscreen mode

owners.js

const {konModel} = require("./db.js")

const Owners = konModel("owners", {
    relationships: () => {
        const pets = require("./pets")
        return {
            pets: {
                from: "owners.pet_id",
                to: "pets.id",
                model: pets

            }
        }
    }
})

module.exports = Owners

Enter fullscreen mode Exit fullscreen mode

Now you can export these objects and use them as you like through out your application. the konModel function version of the model adds the following functions beyond the functions that would already exist from objection.

Model.all

Returns all records for a model

console.log(await Owners.all())
console.log(await Pets.all())
Enter fullscreen mode Exit fullscreen mode

Model.one

Returns a single record based on id

console.log(await Owners.one(1))
console.log(await Pets.one(1)
Enter fullscreen mode Exit fullscreen mode

Model.one

Returns a single record based on id

console.log(await Owners.one(1))
console.log(await Pets.one(1))
Enter fullscreen mode Exit fullscreen mode

Model.create

Creates a Single Record

console.log(await Owners.create({name: "Bob", age: 55}))
console.log(await Pets.create({name: "Spot", age: 5}))
Enter fullscreen mode Exit fullscreen mode

Model.update

Updates a Single Record

console.log(await Owners.update(1, {name: "Bob II", age: 55}))
console.log(await Pets.update(1, {name: "Spot II", age: 5}))
Enter fullscreen mode Exit fullscreen mode

Model.destroy

Updates a Single Record

console.log(await Owners.destroy(1))
console.log(await Pets.destroy(1))
Enter fullscreen mode Exit fullscreen mode

Plus some relation related functions

Model.relate

Relates one record to another based on a configured relationship, first takes the id of the model then the of the related item, and last the string to identify the relationship that was setup when the model was created.

console.log(await Owners.relate(1,1,'pets'))
Enter fullscreen mode Exit fullscreen mode

Model.related

Returns the data of the related items

console.log(await Owners.related(1,'pets'))
Enter fullscreen mode Exit fullscreen mode

Bottom Line

Konjection makes making the initial database connection along with some basic methods for your models. Otherwise you still have access to all the power of the knex and objection libraries.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .