Database Migrations 
Database migrations are a crucial aspect of managing database schemas and data changes in a software project. Knex.js is a popular query builder and migration tool that provides an easy and efficient way to handle database migrations. This document serves as a guide to using Knex.js with TypeScript to manage database migrations effectively.
based on https://knexjs.org/guide/migrations.html
Prerequisites 
Before you begin working with Knex.js and TypeScript, ensure that you have the following prerequisites:
- Node.js and npm (Node Package Manager) installed on your machine.
- A database system supported by Knex.js, such as PostgreSQL, MySQL, or SQLite.
Installation 
To get started, follow these steps to install Knex.js and TypeScript in your project:
- Create a new directory for your project and navigate to it using a terminal. 
- Initialize a new Node.js project by running the following command: shell- npm init -y
- Install the required dependencies by executing the following commands: shell- npm install knex npm install --save-dev knex npm install --save-dev typescript
- Create a - knexfile.tsfile in the project's root directory with the following content:
import type { Knex } from 'knex'
const dotenv = require('dotenv')
dotenv.config()
const config: { [key: string]: Knex.Config } = {
  development: {
    client: 'mysql',
    connection: {
      host: process.env.APP_DB_HOST || process.env.DB_HOST,
      port: +(process.env.APP_DB_PORT || process.env.DB_PORT),
      database: process.env.APP_DB_NAME || process.env.DB_NAME,
      user: process.env.APP_DB_USER || process.env.DB_USER,
      password: process.env.APP_DB_PASSWORD || process.env.DB_PASSWORD
    },
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      extension: 'ts',
      tableName: 'knex_migrations'
    }
  },
  production: {
    client: 'mysql',
    connection: {
      host: process.env.APP_DB_HOST || process.env.DB_HOST,
      port: +(process.env.APP_DB_PORT || process.env.DB_PORT),
      database: process.env.APP_DB_NAME || process.env.DB_NAME,
      user: process.env.APP_DB_USER || process.env.DB_USER,
      password: process.env.APP_DB_PASSWORD || process.env.DB_PASSWORD
    },
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      extension: 'ts',
      tableName: 'knex_migrations'
    }
  }
}
module.exports = configCreating Migrations 
Now that you have set up the project, let's create a migration using Knex.js and TypeScript:
- create migration file - knex migrate:make create_users_table -x ts.
- Open the newly created migration file and add the following code: typescript- import * as Knex from 'knex'; export async function up(knex: Knex): Promise<void> { await knex.schema.createTable('users', (table) => { table.increments('id').primary(); table.string('name'); table.string('email').unique(); table.timestamps(true, true); }); } export async function down(knex: Knex): Promise<void> { await knex.schema.dropTable('users'); }- This example migration creates a - userstable with- id,- name,- email, and- timestampscolumns.
- Open a terminal and run the following command to migrate the database: shell- npx knex migrate:latest --env production- Knex.js will execute the migration and create the - userstable in your configured database.
Rollbacks 
In case you need to rollback a migration, you can use the following command:
npx knex migrate:rollback --env productionThis will revert the last executed migration.
Additional Operations 
Knex.js provides many other migration operations, including adding columns, modifying columns, creating indexes, and executing raw SQL statements. You can find more information and examples in the Knex.js documentation.
Conclusion 
In this document, you learned how to set up Knex.js with TypeScript for managing database migrations. You also created a sample migration file and executed it using Knex.js. With Knex.js and TypeScript, you can easily maintain and evolve your database schema as your project grows.