DEV Community

Cover image for Code First Approach in Node Js !
Megha Ghotkar
Megha Ghotkar

Posted on


Code First Approach in Node Js !

Code First- Approach prioritizing code over schema. Code First is a technique which helps us to create a database, migrates and maintaining the database and its tables from the code.

Sequelize is the package for code first. It can support many databases as well as MYSQL, MSQL and sqlLight. for that

To run sequelize , you should have few things installed on your system.

First we need to install sequelize package

$ npm install --save sequelize

Install sequelize cli

$ npm install sequelize-cli -D

Install database what you want

$ npm install --save mysql2 //sqlite,mssql

Let's start by creating a our configuration file using:

$ npx sequelize-cli init

This will generate a few files for you, your project folder should now look like this:
├── config
│ └── config.json
├── migrations
├── models
│ └── index.js
└── package.json

Connect to the database

    const sequelize = new Sequelize('database', 'username', 
      'password', {
       host: 'localhost',
Enter fullscreen mode Exit fullscreen mode

Test connection to the database

.then(() => {
console.log('Connection has been established successfully.');
.catch(err => {
console.error('Unable to connect to the database:', err);
Enter fullscreen mode Exit fullscreen mode

Defining models
Sequelize is all about the models in database language we can say these are our schemas- the structure that our data takes .Your models are the objects that you will interact with in your application and the primary tables that you will create and manage in your database.

Create models for user table

module.exports = (sequelize: any, DataTypes : any) => {
  class User extends Model<UserAttributes> 
  implements UserAttributes{

    Id!: number;
    FirstName!: string;
    static associate(models : any) {
      // define association here

    Id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      allowNull: false,
      primaryKey: true
    FirstName: {
      type: DataTypes.STRING(20),
      allowNull: false
  }, {
    modelName: 'User',
  return User;
Enter fullscreen mode Exit fullscreen mode

Synchronizing Your Models

The last step to set up Sequelize is to synchronize our models. We can sychronize individual tables by calling .sync() on the table.
For example, user.sync() or role.sync(). To sync the whole database, just use db.sync().
When testing, it's sometimes easier to start with fresh tables every time you launch your application. .sync() can take an object with parameters that allow you to control various aspects of database synchronization. One of these is {force: true}.
db.sync({force: true}) will drop your tables, and resync your data as though you are starting new.

db.sequelize.sync({ force: true }).then(() => {
    app.listen(port, () => {
        console.log("Drop and re-sync DB");
Enter fullscreen mode Exit fullscreen mode

force: true will drop the table if it already exists


The name of migration file is it will have the timestamp of when the migration file was created. This reason is sequelize can run the older migration files first, and then the newer ones that build on top of them. This is useful when changes need to be made to the database.
Also, make sure that your models and your migrations match. The migration files keep track of the state of the database schemas, and should always be created when changes to your models are made. Always commit corresponding migration files when changes to your models are made.

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('user', {

//write code here 

  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('user');
Enter fullscreen mode Exit fullscreen mode

Lets consider you forgot to add Email column in user Table no worry’s sequelize migrations has an addColumn function that will fix the problem
sequelize migration:create --name add-email-to-user

this command only generates migration file so you have to add some code in up and down functions

'use strict';

module.exports = {
  up: function (queryInterface, Sequelize) {
    return queryInterface.addColumn( 'user', 'email', Sequelize.STRING );

  down: function (queryInterface, Sequelize) {
    return queryInterface.removeColumn( 'user', 'email' );
Enter fullscreen mode Exit fullscreen mode

Every time you run sequelize db:migrate it will call the up method. And if you ever want to revert backwards, you can call sequelize db:migrate:undo which will call the down method. They should always be opposite actions, this allows you to safely run migrations and know that the state of the database will be intact.

Oldest comments (0)

An Animated Guide to Node.js Event Loop

Node.js doesn’t stop from running other operations because of Libuv, a C++ library responsible for the event loop and asynchronously handling tasks such as network requests, DNS resolution, file system operations, data encryption, etc.

What happens under the hood when Node.js works on tasks such as database queries? We will explore it by following this piece of code step by step.