Knex

O que é?

Lib para construção de queries utilizando apenas JavaScript.
Muito performático, de forma que pode-se migrar de banco de dados SQL (MySQL, PostgreSQL, MariaDB, Oracle) de uma hora para a outra sem precisar alterar o código.

Instalação

Instalar rodando o comando $ yarn add knex e baixar o driver do Banco SQL que será utilizado (por exemplo: $ yarn add sqlite3).

Verificar as dependências:

https://knexjs.org

Conexão com o Banco de dados

Arquivo src/database/knex.ts

import knex from "knex";
import path from "path";
const connection = knex({
client: "sqlite3",
connection: {
filename: path.resolve(__dirname, "database.sqlite"),
},
});
export default connection;

Arquivo knexfile.ts

import path from "path";
module.exports = {
client: "sqlite3",
connection: {
filename: path.resolve(__dirname, "src", "database", "database.sqlite"),
},
migrations: {
directory: path.resolve(__dirname, "src", "database", "migrations"),
},
seeds: {
directory: path.resolve(__dirname, "src", "database", "seeds"),
},
useNullAsDefault: true,
};

Migrations

Criação

Para criar uma migration utilizando o Knex, é recomendável usar números (por exemplo: src/database/migrations/01_create_users)

Modelo de Migration:

import Knex from "knex";
export async function up(knex: Knex) {
return knex.schema.createTable("points", (table) => {
table.increments("id").primary();
table.string("image").notNullable();
table.string("name").notNullable();
table.string("email").notNullable();
table.string("whatsapp").notNullable();
table.decimal("latitude").notNullable();
table.decimal("longitude").notNullable();
table.string("city").notNullable();
table.string("uf", 2).notNullable();
});
}
export async function down(knex: Knex) {
return knex.schema.dropTable("points");
}

Executando

Para executar as migrations, basta rodar o comando:

$ npx knex migrate:latest

Seeds

Criação

Para criar uma seed utilizando o Knex, é recomendável usar números (por exemplo: src/database/seeds/01_generate_users)

Modelo de Migration:

import Knex from "knex";
export async function up(knex: Knex) {
return knex.schema.createTable("points", (table) => {
table.increments("id").primary();
table.string("image").notNullable();
table.string("name").notNullable();
table.string("email").notNullable();
table.string("whatsapp").notNullable();
table.decimal("latitude").notNullable();
table.decimal("longitude").notNullable();
table.string("city").notNullable();
table.string("uf", 2).notNullable();
});
}
export async function down(knex: Knex) {
return knex.schema.dropTable("points");
}

Executando

Para executar as migrations, basta rodar o comando:

$ npx knex migrate:latest

Scripts no package.json

{
"knex:seed": "knex --knexfile knexfile.ts seed:run",
"knex:migrate": "knex --knexfile knexfile.ts migrate:latest"
}

Conexão

Configurando a Conexão

Configurando as conexões no arquivo src/database/connection.js:

const knex = require('knex');
const configuration = require('../../knexfile');
const connection = knex(configuration.development);
module.exports = connection;

Conectando com o BDD

Arquivo src/routes.js

// Importação do arquivo de conexão
const connection = require('./database/connection');
// ...
// Inserindo na tabela 'ongs' o conteúdo de variáveis definidas anteriormente
await connection('ongs').insert({
id,
name,
email,
whatsapp,
city,
uf,
});