Getting Started with Sequelize

Installation

To begin using Sequelize, you need to install it along with the database driver for your chosen SQL dialect. For this tutorial, we'll use PostgreSQL as an example.

npm install sequelize pg pg-hstore

Setting Up Sequelize

After installation, you can set up Sequelize in your application:

const { Sequelize } = require('sequelize');

// Initialize Sequelize
const sequelize = new Sequelize('database', 'username', 'password', {
    host: 'localhost',
    dialect: 'postgres',
});

// Test the connection
async function testConnection() {
    try {
        await sequelize.authenticate();
        console.log('Connection has been established successfully.');
    } catch (error) {
        console.error('Unable to connect to the database:', error);
    }
}

testConnection();

Defining Models

Models in Sequelize represent tables in your database. You can define a model using the define method:

const User = sequelize.define('User', {
    // attributes
    username: {
        type: Sequelize.STRING,
        allowNull: false,
    },
    email: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: true,
    },
    password: {
        type: Sequelize.STRING,
        allowNull: false,
    },
}, {
    // options
    tableName: 'users',
});

Syncing Models with the Database

To create the corresponding table in the database, you can use the sync method:

async function syncModels() {
    await sequelize.sync({ force: true }); // Use force: true only in development
    console.log("The table for the User model was just (re)created!");
}

syncModels();

Associations

Sequelize supports various types of associations: one-to-one, one-to-many, and many-to-many. Here’s how to define them:

One-to-Many Association

const Post = sequelize.define('Post', {
    title: {
        type: Sequelize.STRING,
        allowNull: false,
    },
    content: {
        type: Sequelize.TEXT,
    },
});

// Define the association
User.hasMany(Post);
Post.belongsTo(User);

Many-to-Many Association

For many-to-many relationships, you need to create a junction table:

const Role = sequelize.define('Role', {
    name: {
        type: Sequelize.STRING,
        allowNull: false,
    },
});

// Define the many-to-many association
User.belongsToMany(Role, { through: 'UserRoles' });
Role.belongsToMany(User, { through: 'UserRoles' });

Querying Data

Sequelize provides a powerful querying interface. Here are some common query operations:

Creating Records

async function createUser() {
    const user = await User.create({
        username: 'john_doe',
        email: '[email protected]',
        password: 'securepassword',
    });
    console.log(user.toJSON());
}

createUser();

Retrieving Records

You can retrieve records using various methods:

async function findUsers() {
    const users = await User.findAll();
    console.log(users);
}

findUsers();

Updating Records

Updating records is straightforward:

async function updateUser(userId) {
    const user = await User.findByPk(userId);
    if (user) {
        user.username = 'john_doe_updated';
        await user.save();
        console.log('User updated:', user.toJSON());
    }
}

updateUser(1);

Deleting Records

To delete a record, you can use the destroy method:

async function deleteUser(userId) {
    const user = await User.findByPk(userId);
    if (user) {
        await user.destroy();
        console.log('User deleted:', userId);
    }
}

deleteUser(1);

Migrations

Using migrations is essential for managing database schema changes. Sequelize provides a CLI to create and run migrations.

Creating a Migration

To create a migration, use the Sequelize CLI:

npx sequelize-cli migration:generate --name create-users

This command will generate a new migration file in the migrations folder. You can then define the up and down methods:

'use strict';

module.exports = {
    up: async (queryInterface, Sequelize) => {
        await queryInterface.createTable('users', {
            id: {
                type: Sequelize.INTEGER,
                autoIncrement: true,
                primaryKey: true,
            },
            username: {
                type: Sequelize.STRING,
                allowNull: false,
            },
            email: {
                type: Sequelize.STRING,
                allowNull: false,
                unique: true,
            },
            password: {
                type: Sequelize.STRING,
                allowNull: false,
            },
            createdAt: {
                allowNull: false,
                type: Sequelize.DATE,
            },
            updatedAt: {
                allowNull: false,
                type: Sequelize.DATE,
            },
        });
    },

    down: async (queryInterface, Sequelize) => {
        await queryInterface.dropTable('users');
    }
};

Running Migrations

To run your migrations, execute:

npx sequelize-cli db:migrate

Conclusion

Sequelize is a robust ORM that simplifies SQL database interactions in Node.js applications. By defining models, setting up associations, querying data, and managing migrations, you can efficiently handle database operations while adhering to best practices.


Learn more with useful resources