Knex.js es un generador de consultas SQL flexible para Node.js compatible con PostgreSQL, MySQL, SQLite3, CockroachDB y más.
Inicialización y Conexión
const knex = require('knex')({
client: 'pg', // 'mysql2', 'sqlite3', etc.
connection: {
host: '127.0.0.1',
port: 5432,
user: 'db_user',
password: 'password',
database: 'myapp_db'
},
pool: { min: 2, max: 10 }
});
Consultas de selección y uniones (Select & Joins)
// SELECT id, name, email FROM users WHERE age >= 18 ORDER BY created_at DESC LIMIT 20
const users = await knex('users')
.select('id', 'name', 'email')
.where('age', '>=', 18)
.orderBy('created_at', 'desc')
.limit(20);
// Inner Join with Profiles
const userProfiles = await knex('users')
.join('profiles', 'users.id', '=', 'profiles.user_id')
.select('users.name', 'profiles.avatar_url', 'profiles.bio');
// Where in array
const results = await knex('orders')
.whereIn('status', ['paid', 'processing']);
Insertar, Actualizar y Eliminar (Insert, Update, Delete)
// Insert row(s) and return id
const [newUserId] = await knex('users')
.insert({ name: 'Alice', email: '[email protected]' })
.returning('id');
// Update matching records
await knex('users')
.where('id', '=', newUserId)
.update({ name: 'Alice Smith', updated_at: knex.fn.now() });
// Delete record
await knex('users')
.where('id', '=', newUserId)
.del();
Gestión de transacciones (Transactions)
await knex.transaction(async (trx) => {
const [accountId] = await trx('accounts')
.insert({ balance: 1000 })
.returning('id');
await trx('audit_logs').insert({
action: 'CREATE_ACCOUNT',
account_id: accountId
});
});
Constructor de esquemas y migraciones (Schema & Migrations)
Creación de tablas en código
await knex.schema.createTable('users', (table) => {
table.increments('id').primary();
table.string('email').unique().notNullable();
table.string('password_hash').notNullable();
table.boolean('is_active').defaultTo(true);
table.timestamps(true, true); // created_at and updated_at
});
Archivo de migración (migrations/20261108_create_users.js)
exports.up = function (knex) {
return knex.schema.createTable('posts', (table) => {
table.increments('id');
table.integer('user_id').unsigned().references('id').inTable('users').onDelete('CASCADE');
table.string('title').notNullable();
table.text('content');
table.timestamps(true, true);
});
};
exports.down = function (knex) {
return knex.schema.dropTableIfExists('posts');
};
Ejecución de migraciones mediante CLI
knex migrate:latest
knex migrate:rollback
knex seed:run