Sequelize в Node.js: Руководство

Sequelize — это инструмент ORM (Object Relational Mapping) для Node.Js. В nodejs Sequelize помогает нам легко генерировать сложные запросы для таких баз данных, как MySQL, PostgreSQL , MariaDB, Microsoft`` SQL Server , SQLite и т. д. Мы можем создать базу данных, создать таблицу, удалить таблицу, создать строку, обновить строку, удалить строку, выбрать строку и т. д. с помощью Sequelize на основе объектов и обещаний в nodejs .

Предварительные условия

  • На локальной машине разработки должны быть установлены Nodejs и MySQL . - Базовые знания объектов JavaScript, обещаний и типов данных.
  • Хорошее понимание основных запросов MySQL и реляционных баз данных.

Примечание: обязательно добавьте путь к переменной среды PATH для Nodejs и MySQL.

Введение

Реляционные базы данных ( MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, SQLite и т. д. ) используют SQL-запросы для управления данными. Эти запросы могут увеличить сложность и занять много времени. Кроме того, мы склонны забывать эти SQL-запросы. Поэтому мы используем инструмент ORM ( Object-Relational Mapping ), который сопоставляет объект javascript с необработанными SQL-запросами реляционной базы данных. Sequelize в nodejs — это объектно-реляционный преобразователь. Sequelize использует объекты javascript и обещания для взаимодействия с базой данных. Следовательно, Sequelize менее сложен, менее затратен по времени, быстр и прост в изучении. Здесь мы обсудим управление реляционными базами данных с помощью Sequelize в nodejs.

введение в Sequelize в Node.js

Особенности Sequelize

  • Sequelize — это ORM-инструмент на основе обещаний, созданный для nodejs.
  • Нам не нужно запоминать синтаксис запросов, поскольку Sequelize использует объект JavaScript .
  • Sequelize поддерживает различные базы данных, например MySQL , PostgreSQL , MariaDB , Microsoft SQL Server , SQLite и т. д.

Установка и настройка Sequelize

Установка Sequelize

  • Создайте новую папку с именем node-with-sequelize и перейдите в текущую папку node-with-sequelize с помощью CLI (интерфейса командной строки), как показано ниже:
mkdir node-with-sequelize
cd node-with-sequelize
  • Инициализируйте проект Node, который создаст файл package.json внутри папки node-with-sequelize .
npm init -y
  • Создайте файл с именем server.js внутри папки node-with-sequelize . Теперь структура папок будет выглядеть так, как показано ниже:
node-with-sequelize/
├─ server.js
├─ package.json
  • Установите и сохраните пакет npm sequelize для sequelize ORM и драйвер mysql2 для базы данных MySQL.
npm install --save sequelize
npm install --save mysql2

Примечание: Существуют различные базы данных. Для этой статьи мы используем только базу данных MySQL. Однако мы можем использовать любую другую базу данных, установив соответствующие драйверы, как показано ниже:

  • Для PostgreSQL, npm install --save pg pg-hstore # Postgres
  • Для MySQL npm install --save mysql2
  • Для MariaDB, npm install --save mariadb
  • Для SQLite, npm install --save sqlite3
  • Для Microsoft SQL Server npm install --save утомительно # Microsoft SQL Server

Создание образца базы данных

Мы установили и настроили базу данных MySQL. Итак, у нас есть имя пользователя и пароль для входа в базу данных MySQL на локальной машине.

  • Мы запустим следующую команду в командной строке и заменим USERNAME на имя пользователя вашей базы данных.
mysql -u USERNAME -p
  • После запуска указанной выше команды MySQL запросит пароль. Итак, вводим пароль и нажимаем клавишу Enter .
  • Мы создадим новую базу данных с именем sequelize_db и проверим, была ли создана база данных или нет.
mysql> CREATE DATABASE sequelize_db;
mysql> SHOW DATABASES;
  • При запуске команды SHOW DATABASES появится список баз данных:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sequelize_db       |
| student_database   |
| world              |
+--------------------+

Примечание: Каждая команда SQL должна заканчиваться точкой с запятой и использовать QUIT для закрытия соединения с базой данных MySQL.

Подключение к базе данных MySQL

  • Мы создадим файл с именем config.js и добавим следующий код в файл config.js . Вы назначите свое имя пользователя базы данных и пароль базы данных DATABASE_USERNAME и DATABASE_PASSWORD соответственно.
const DATABASE_NAME = 'sequelize_db'
const DATABASE_USERNAME = 'your_database_username'
const DATABASE_PASSWORD = 'your_database_password'

module.exports = {
    DATABASE_NAME,
    DATABASE_USERNAME,
    DATABASE_PASSWORD
}
  • Теперь мы установим соединение между приложением node и базой данных MySQL с помощью Sequelize. Мы добавим следующий код в файл server.js .
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME,
    DATABASE_USERNAME,
    DATABASE_PASSWORD } = require('./config')

// Create an instance of sequelize
const sequelize =
    new Sequelize(DATABASE_NAME,
        DATABASE_USERNAME,
        DATABASE_PASSWORD, {
        host: 'localhost',
        dialect: 'mysql'
    })

// Validate and connect to the database
sequelize
    .authenticate()
    .then(() => console.log('Successfully connected to the database!'))
    .catch((error) => console.log('Failed to connect the database:', error))
  • В приведенном выше блоке кода мы создаем экземпляр Sequelize для подключения нашего приложения node к базе данных MySQL. Также мы используем метод authenticate() для проверки учетных данных базы данных и проверки того, подключена ли база данных или нет.


Примечание: диалект может быть разным для разных баз данных. Это может быть MySQL, MariaDB, Postgres, mssql в зависимости от используемой нами базы данных.

Использование Sequelize для запросов к базе данных

  • Мы создадим новый файл с именем studentDB.js внутри папки node-with-sequelize и базу данных с именем student_database .
mysql> CREATE DATABASE student_database 
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME,
    DATABASE_USERNAME,
    DATABASE_PASSWORD } = require('./config')

// Create an instance of sequelize
const sequelize =
    new Sequelize('student_database',
        DATABASE_USERNAME,
        DATABASE_PASSWORD, {
        host: 'localhost',
        dialect: 'mysql'
    })

// Validate and connect to the database
sequelize.authenticate()
    .then(() => console.log('Successfully connected to `student_database`!'))
    .catch((error) => console.log('Failed to connect `student_database`:', error))
  • Мы добавляем указанный выше код в файл studentDB.js и подключаем student_database к нашему приложению Node.
  • Теперь мы определим модель с именем student, используя метод define() , который делает имя модели множественным числом, и создадим таблицу с именем students в student_database . Мы добавляем следующий код в файл studentDB.js :
// Define the student model that creates a table in the `student_database`
const Student = sequelize.define('student', {
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING
})
  • В приведенном выше блоке кода мы используем метод sequelize.define() для создания модели, представляющей таблицу и описывающей столбцы.

1. Вставка новой строки

  • Мы создаем новый файл с именем addStudent.js внутри папки node-with-sequelize и добавляем следующий код в файл addStudent.js .
// Copy the code from `studentDB.js` and paste it here

// Synchronize database or model using sequelize.sync() or Student.sync()
sequelize.sync()
    .then(async () => {
        // Insert new row using `create()` method
        await Student.create({
            firstName: 'Modi',
            lastName: 'Singh'
        })
        console.log('Successfully added a new student!')
    })
    .catch((error) => console.log('Failed to synchronize with the database:', error))
  • В приведенном выше блоке кода мы используем метод create() для добавления нового студента в таблицу студентов . Метод create() позволяет нам передавать данные о новом студенте в формате объекта.

2. Выбор всех строк

  • Мы создаем файл с именем getStudents.js внутри папки node-with-sequelize и добавляем следующий код в файл getStudents.js
// Copy the code of `studentDB.js` here

// Synchronize database or model using sequelize.sync() or Student.sync()
sequelize.sync()
    .then(async () => {
        let students;
        // Select all rows using `findAll()` method
        students = await Student.findAll({raw:true})
        console.log('List of students', students)
    })
    .catch((error) => console.log('Failed to synchronize with the database', error))
  • В приведенном выше блоке кода мы используем findAll() для извлечения всех студентов из таблицы студентов . Метод findAll() принимает необязательный объект для предоставления дополнительной информации.
  • В приведенном выше примере мы используем свойство raw , которое принимает логическое значение: true или false . Когда мы устанавливаем raw в true , findall() не возвращает метаданные при возврате обещаний.

3. Выбор строки с использованием предложения where

  • Мы создаем файл с именем getStudent.js и добавляем в него следующий код .
// Copy the code of `studentDB.js` here

// Synchronize database or model using sequelize.sync() or Student.sync()
sequelize.sync()
    .then(async () => {
        let student;
        // Select a row using `findOne()` method and where clause
        student = await Student.findOne({
            raw: true,
            where: { id: 1 }
        })
        console.log('Fetched one student', student)
    })
    .catch((error) => console.log('Failed to synchronize with the database', error))
  • В приведенном выше блоке кода мы используем findOne() для извлечения студента по id . Однако мы также можем использовать firstName и lastName для извлечения студента. findOne() возвращает только первую запись, если в таблице есть дублирующая запись.

4. Удаление строки с использованием предложения where

  • Мы создаем файл с именем removeStudent.js и добавляем в него следующий код .
// Copy the code of `studentDB.js` here         

// Synchronize database or model using sequelize.sync() or Student.sync()
sequelize.sync()
    .then(async () => {

        // Delete all rows using `destroy()` method and `where` clause
        await Student.destroy({ where: { id: 1 } })
        console.log('Deleted One student!')
    })
    .catch((error) => console.log('Failed to synchronize with the database', error))
  • В приведенном выше блоке кода мы используем метод destroy() для удаления конкретного студента из таблицы students . Метод destroy() принимает необязательный объект для предоставления дополнительной информации. В приведенном выше примере мы используем свойство where для получения идентификатора студента и удаления студента из таблицы students .

5. Удаление всех строк

  • Мы создаем файл с именем removeStudents.js и добавляем в него следующий код .
// Copy the code of `studentDB.js` here         

// Synchronize database or model using sequelize.sync() or Student.sync()
sequelize.sync()
    .then(async () => {
        // Delete all rows using `destroy()` method and set `truncate` to true
        await Student.destroy({ truncate: true })
        console.log('Deleted all students!')
    })
    .catch((error) => console.log('Failed to synchronize with the database', error))
  • В приведенном выше примере мы используем свойство truncate , устанавливаем его в значение true и удаляем всех студентов из таблицы students .

Создание ассоциаций с использованием Sequelize

Sequelize имеет четыре метода для создания ассоциации между моделями: belongsTo() , hasOne() , hasMany() , belongsToMany() .

1. Отношения один к одному

  • Рассмотрим, у нас есть выборка данных студентов и три уровня оценок: A , B и C. Каждый студент может иметь только одну оценку. Следовательно, это отношение один к одному.
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME,
    DATABASE_USERNAME,
    DATABASE_PASSWORD } = require('./config')

// Create an instance of sequelize
const sequelize =
    new Sequelize('student_database',
        DATABASE_USERNAME,
        DATABASE_PASSWORD, {
        host: 'localhost',
        dialect: 'mysql'
    })

// Validate and connect to the database
sequelize.authenticate()
    .then(() => console.log('Successfully connected to `student_database`!'))
    .catch((error) => console.log('Failed to connect `student_database`:', error))

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Define Grade Model
const Grade = sequelize.define('grade', {
    grade: {
        type: DataTypes.STRING
    }
})

// Students List
const students =
    [{ id: 1, firstName: 'Modi', lastName: 'Singh', gradeId: '1' },
    { id: 2, firstName: 'Suhani', lastName: 'Shah', gradeId: '3' },
    { id: 3, firstName: 'Abdul', lastName: 'Kalam', gradeId: '2' },
    { id: 4, firstName: 'Shahrukh', lastName: 'Khan', gradeId: '1' },
    { id: 5, firstName: 'Akshay', lastName: 'Kumar', gradeId: '3' }]

// Grades List
const grades = [{ grade: 'A' }, { grade: 'B' }, { grade: 'C' }]

// One to One Relationship using `hasOne()` method
Student.hasOne(Grade);

sequelize.sync({ force: true }).then(() => {
    // Create grades in bulk
    Grade.bulkCreate(grades, { validate: true }).then(() => {
        // Create students in bulk
        Student.bulkCreate(students, { validate: true }).then(() => {
            Student.findAll({ // find all students including their grades
                raw: true,
                include: [{
                    model: Grade
                }]
            }).then(response => {
                console.log(response)
            }).catch((error) => {
                console.error('Failed to retrieve data : ', error);
            });
        }).catch((err) => { console.log(err); });
    }).catch((err) => { console.log(err); });
}).catch((error) => {
    console.error('Unable to create the table : ', error);
});
  • В приведенном выше примере мы используем метод hasOne() , который добавляет внешний ключ studentId к целевой модели Grade :
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int          | NO   | PRI | NULL    | auto_increment |
| grade     | varchar(255) | YES  |     | NULL    |                |
| createdAt | datetime     | NO   |     | NULL    |                |
| updatedAt | datetime     | NO   |     | NULL    |                |
| studentId | int          | YES  | MUL | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
  • Мы также можем использовать метод belongsTo() , который добавит внешний ключ gradeId к исходной модели Student :
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id        | int          | NO   | PRI | NULL    |       |
| firstName | varchar(255) | YES  |     | NULL    |       |
| lastName  | varchar(255) | YES  |     | NULL    |       |
| createdAt | datetime     | NO   |     | NULL    |       |
| updatedAt | datetime     | NO   |     | NULL    |       |
| gradeId   | int          | YES  | MUL | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

2. Отношение «один ко многим»

  • Опять же, рассмотрим ту же выборку студентов и три уровня оценок: A , B и C. Мы можем дать одну оценку нескольким студентам. Следовательно, это отношение «один ко многим».
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME,
    DATABASE_USERNAME,
    DATABASE_PASSWORD } = require('./config')

// Create an instance of sequelize
const sequelize =
    new Sequelize('student_database',
        DATABASE_USERNAME,
        DATABASE_PASSWORD, {
        host: 'localhost',
        dialect: 'mysql'
    })

// Validate and connect to the database
sequelize.authenticate()
    .then(() => console.log('Successfully connected to `student_database`!'))
    .catch((error) => console.log('Failed to connect `student_database`:', error))

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Define Grade Model
const Grade = sequelize.define('grade', {
    grade: {
        type: DataTypes.STRING
    }
})

// Students List
const students =
    [{ id: 1, firstName: 'Modi', lastName: 'Singh', gradeId: '1' },
    { id: 2, firstName: 'Suhani', lastName: 'Shah', gradeId: '3' },
    { id: 3, firstName: 'Abdul', lastName: 'Kalam', gradeId: '2' },
    { id: 4, firstName: 'Shahrukh', lastName: 'Khan', gradeId: '1' },
    { id: 5, firstName: 'Akshay', lastName: 'Kumar', gradeId: '3' }]

// Grades List
const grades = [{ grade: 'A' }, { grade: 'B' }, { grade: 'C' }]

// One-to-Many Relationship
Grade.hasMany(Student);

sequelize.sync({ force: true }).then(() => {
    // Create grades in bulk
    Grade.bulkCreate(grades, { validate: true }).then(() => {
        // Create students in bulk
        Student.bulkCreate(students, { validate: true }).then(() => {
            Grade.findAll({ // find all students by selecting a particular grade
                raw: true,
                where: { grade: 'A' },
                include: [{
                    model: Student
                }]
            }).then(response => {
                console.log(response)
            }).catch((error) => {
                console.error('Failed to retrieve data : ', error);
            });
        }).catch((err) => { console.log(err); });
    }).catch((err) => { console.log(err); });
}).catch((error) => {
    console.error('Unable to create the table : ', error);
});
  • В приведенном выше примере мы используем метод hasMany() , который добавляет внешний ключ gradeId к целевой модели Student :
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id        | int          | NO   | PRI | NULL    |       |
| firstName | varchar(255) | YES  |     | NULL    |       |
| lastName  | varchar(255) | YES  |     | NULL    |       |
| createdAt | datetime     | NO   |     | NULL    |       |
| updatedAt | datetime     | NO   |     | NULL    |       |
| gradeId   | int          | YES  | MUL | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

Отношение «многие ко многим»

  • Рассмотрим, у нас есть три модели: Student , Course и Enrollment . Любой студент может записаться на любой курс. Поэтому у нас есть отношения многие-ко-многим.
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME,
    DATABASE_USERNAME,
    DATABASE_PASSWORD } = require('./config')

// Create an instance of sequelize
const sequelize =
    new Sequelize('student_database',
        DATABASE_USERNAME,
        DATABASE_PASSWORD, {
        host: 'localhost',
        dialect: 'mysql'
    })

// Validate and connect to the database
sequelize.authenticate()
    .then(() => console.log('Successfully connected to `student_database`!'))
    .catch((error) => console.log('Failed to connect `student_database`:', error))

// Define Course Model
const Course = sequelize.define('course', {
    courseName: {
        type: DataTypes.STRING
    }
})

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

//Student's enrollment in the courses
const Enrollment = sequelize.define('enrollment', {
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
    }
})

// Students List
const students =
    [{ id: 1, firstName: 'Modi', lastName: 'Singh' },
    { id: 2, firstName: 'Suhani', lastName: 'Shah' },
    { id: 3, firstName: 'Abdul', lastName: 'Kalam' },
    { id: 4, firstName: 'Shahrukh', lastName: 'Khan' },
    { id: 5, firstName: 'Akshay', lastName: 'Kumar' }]

// Courses List
const courses =
    [{ courseName: 'NodeJS' },
    { courseName: 'MySQL Database' },
    { courseName: 'Sequelize ORM' }]

// Enrollments 
const enrollments = [
    { courseId: 1, studentId: 5 },
    { courseId: 3, studentId: 3 },
    { courseId: 3, studentId: 1 },
    { courseId: 1, studentId: 4 },
    { courseId: 2, studentId: 2 },
]
// Many-to-many Relationship
Course.belongsToMany(Student, { through: Enrollment });
Student.belongsToMany(Course, { through: Enrollment });

sequelize.sync({ force: true }).then(() => {
    Course.bulkCreate(courses, { validate: true }).then(() => {
        Student.bulkCreate(students, { validate: true }).then(() => {
            Enrollment.bulkCreate(enrollments, { validate: true }).then(() => {
                Course.findAll({
                    raw: true,
                    include: {
                        model: Student,
                    },
                }).then(result => {
                    console.log(result);
                }).catch((error) => {
                    console.error('Failed to retrieve data : ', error);
                });
            }).catch((error) => {
                console.log(error);
            });
        }).catch((error) => {
            console.log(error);
        });
    }).catch((error) => {
        console.log(error);
    });
}).catch((error) => {
    console.error('Unable to create the table : ', error);
});
  • В приведенном выше примере мы устанавливаем связь между моделью Student и моделью Course через модель Enrollment . Мы используем метод belongsToMany() , который добавляет внешний ключ courseId и studentId к модели Enrollment .
+-----------+----------+------+-----+---------+----------------+
| Field     | Type     | Null | Key | Default | Extra          |
+-----------+----------+------+-----+---------+----------------+
| id        | int      | NO   | PRI | NULL    | auto_increment |
| createdAt | datetime | NO   |     | NULL    |                |
| updatedAt | datetime | NO   |     | NULL    |                |
| courseId  | int      | YES  | MUL | NULL    |                |
| studentId | int      | YES  | MUL | NULL    |                |
+-----------+----------+------+-----+---------+----------------+

Работа с необработанными запросами

1. Заполнение таблицы с помощью bulkCreate()

const { Sequelize, DataTypes } = require('sequelize')

// Create Sequilize Instance
const sequelize = new Sequelize('student_database', 'DATABASE_USERNAME', 'DATABASE_PASSWORD', {
    host: 'localhost',
    dialect: 'mysql',
})

// Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((error) => {
    console.error('OOPS! Failed to connect', error);
});

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Student data
const students =
    [{ id: 1, firstName: 'Modi', lastName: 'Singh' },
    { id: 2, firstName: 'Suhani', lastName: 'Shah' },
    { id: 3, firstName: 'Abdul', lastName: 'Kalam' },
    { id: 4, firstName: 'Shahrukh', lastName: 'Khan' },
    { id: 5, firstName: 'Akshay', lastName: 'Kumar' }]

// Populate table with data
sequelize.sync().then(() => {
    // Add students in bulk
    Student.bulkCreate(students, { validate: true }).then(() => {
        console.log("Students are added to database");
    }).catch((error) => {
        console.log(error);
    });
});

В приведенном выше блоке кода мы используем метод bulkCreate() для добавления нескольких строк. bulkCreate() принимает два параметра: массив данных о студентах и ​​необязательный объект для передачи дополнительной информации.

2. Замена массива

const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME,
    DATABASE_USERNAME,
    DATABASE_PASSWORD } = require('./config')

// Create an instance of sequelize
const sequelize =
    new Sequelize('student_database',
        DATABASE_USERNAME,
        DATABASE_PASSWORD, {
        host: 'localhost',
        dialect: 'mysql'
    })

// Validate and connect to the database
sequelize.authenticate()
    .then(() => console.log('Successfully connected to `student_database`!'))
    .catch((error) => console.log('Failed to connect `student_database`:', error))

// Use `SELECT` Query With un-named
sequelize.query('SELECT * FROM students WHERE firstName = ?', {
    replacements: ['Abdul'], type: sequelize.QueryTypes.SELECT
})
    .then((response) => {
        console.log(response)
    })
    .catch((err) => {
        console.log(err)
    })

В приведенном выше блоке кода мы используем сырой запрос MySQL с Sequelize. Символ ? используется для извлечения данных о студентах и ​​будет заменен массивом, переданным свойству replacements .

3. Замена объекта

const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME,
    DATABASE_USERNAME,
    DATABASE_PASSWORD } = require('./config')

// Create an instance of sequelize
const sequelize =
    new Sequelize('student_database',
        DATABASE_USERNAME,
        DATABASE_PASSWORD, {
        host: 'localhost',
        dialect: 'mysql'
    })

// Validate and connect to the database
sequelize.authenticate()
    .then(() => console.log('Successfully connected to `student_database`!'))
    .catch((error) => console.log('Failed to connect `student_database`:', error))

// Use `SELECT` Query With named parameters
sequelize.query('SELECT * FROM students WHERE firstName = :name', {
    replacements: {name:'Abdul'}, type: sequelize.QueryTypes.SELECT
})
    .then((response) => {
        console.log(response)
    })
    .catch((err) => {
        console.log(err)
    })

В приведенном выше блоке кода мы используем ключ :name для извлечения данных о студентах. :name будет заменен ключом объекта, переданного свойству replacements .

Примеры

Определение модели Sequelize

  • Модель в Sequelize создает таблицу в базе данных, которая содержит строки и столбцы. В приведенном выше блоке кода sequelize является экземпляром Sequelize ORM. .define() содержит три параметра:

Синтаксис

    sequelize.define('model_name',attributes_typeobject,others_typeObject)
  • Имя модели: Создает новую таблицу в базе данных, содержащую строки и столбцы. Это должна быть строка.
  • Атрибуты: создает поля в столбце со своими типами данных и другими параметрами. Это должен быть объект
  • Другое: содержит любые другие необязательные параметры и является типом объекта.
  • Рассмотрим, мы хотим создать таблицу студентов, которая содержит столбцы: id , firstName , и lastName . Итак, мы создаем файл с именем student.model.js и добавляем следующий код в файл student.model.js
const {Sequelize, DataTypes} = require('sequelize');

// Create Sequelize Instance
const sequelize = new Sequelize(
    'student_database',
    'DATABASE_USERNAME',
    'DATABASE_PASSWORD',
    {
        host: 'localhost',
        dialect: 'mysql'
    }
);

// Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((error) => {
   console.error('OOPS! Failed to connect', error);
});

// Define Student Model
const Student = sequelize.define('student',{
    id: DataTypes.INTEGER,
    firstName: Datatypes.STRING,
    lastName:DataTypes.STRING
});

// Createa table in Database
sequeliz e.sync().then(() => {
    console.log('Created the student table successfully');
}).catch((error) => {
    console.error('Operatioununsuccessfull:', error);
});

Вывод При запуске команды node student.model имя модели будет преобразовано во множественное число, а в базе данных student_database будет создана таблица с именем students .

$ node student.model
Executing (default): SELECT 1+1 AS result
Executing (default): DROP TABLE IF EXISTS `students`;
The app is successfully connected to the database.
Executing (default): CREATE TABLE IF NOT EXISTS `students` (`id` INTEGER , `firstName` VARCHAR(255), `lastName` VA
RCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;      
Executing (default): SHOW INDEX FROM `students`
Created the student table successfully

В student_database будет создана таблица студентов , как показано ниже:

mysql> DESC students;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id        | int         | NO   | PRI | NULL    |       |
| firstName | varchar(255)| YES  |     | NULL    |       |
| lastName  | varchar(255)| YES  |     | NULL    |       |
| createdAt | datetime    | NO   |     | NULL    |       |
| updatedAt | datetime    | NO   |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

Таблица сброса Sequelize

  • Мы используем метод .drop() для удаления таблицы из базы данных.
  • Мы создадим файл с именем student.drop.js и добавим следующий код в файл student.drop.js
const {Sequelize, DataTypes} = require("sequelize");

// Create Sequelize Instance
const sequelize = new Sequelize(
    'student_database',
    'DATABASE_USERNAME',
    'DATABASE_PASSWORD',
    {
        host: 'localhost',
        dialect: 'mysql'
    }
);

// Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((error) => {
   console.error('OOPS! Failed to connect', error);
});

// Define Student Model
const Student = sequelize.define('student',{
    id: DataTypes.INTEGER,
    firstName:Datatypes.STRING,
    lastName:DataTypes.STRING
});

// Drop Model from Database
sequelize.drop().then(() => {
    console.log('Deleted the students table successfully);
}).catch((error) => {
    console.error('Operation unsuccesful:', error);
});

Вывод При запуске команды node student.drop она удалит таблицу students из student_databse .

$ node student.drop
Executing (default): SELECT 1+1 AS result
Executing (default): DROP TABLE IF EXISTS `students`;
App is successfully connected to the database.
Deleted thstudent'sts table successfully

Sequelize bulkСоздать

  • Мы используем метод bulkCreate() для одновременного добавления нескольких строк.
  • Мы создадим файл с именем student.bulkCreate.js и добавим в файл student.bulkCreate.js следующий код .
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME, DATABASE_PASSWORD } = require('./config')

// Create Sequilize Instance
const sequelize = new Sequelize('student_database', DATABASE_NAME, DATABASE_PASSWORD, {
    host: 'localhost',
    dialect: 'mysql',
})

// Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((error) => {
    console.error('OOPS! Failed to connect', error);
});

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Populate with data
const students =
    [{ id: 1, firstName: 'Modi', lastName: 'Singh' },
    { id: 2, firstName: 'Suhani', lastName: 'Shah' },
    { id: 3, firstName: 'Abdul', lastName: 'Kalam' },
    { id: 4, firstName: 'Shahrukh', lastName: 'Khan' },
    { id: 5, firstName: 'Akshay', lastName: 'Kumar' }]

// Sync, bulk create, validate and Close The Connection
sequelize.sync().then(() => {
    Student.bulkCreate(students, { validate: true }).then(() => {
        console.log("Students are added to database");
    }).catch((error) => {
        console.log(error);
    });
});

Вывод При запуске команды node student.bulkCreate данные о студентах будут добавлены в таблицу students базы данных student_database .

+----+-----------+----------+---------------------+---------------------+
| id | firstName | lastName | createdAt           | updatedAt           |
+----+-----------+----------+---------------------+---------------------+
|  1 | Modi      | Singh    | 2022-10-23 06:35:17 | 2022-10-23 06:35:17 |
|  2 | Suhani    | Shah     | 2022-10-23 06:35:17 | 2022-10-23 06:35:17 |
|  3 | Abdul     | Kalam    | 2022-10-23 06:35:17 | 2022-10-23 06:35:17 |
|  4 | Shahrukh  | Khan     | 2022-10-23 06:35:17 | 2022-10-23 06:35:17 |
|  5 | Akshay    | Kumar    | 2022-10-23 06:35:17 | 2022-10-23 06:35:17 |
+----+-----------+----------+---------------------+---------------------+

Sequelize findOne

  • Мы используем метод findOne() для получения одной строки по id .
  • Мы создадим файл с именем student.findOne.js и добавим в него следующий код .
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME, DATABASE_PASSWORD } = require('./config')

// Create Sequilize Instance
const sequelize = new Sequelize('student_database', DATABASE_NAME, DATABASE_PASSWORD, {
    host: 'localhost',
    dialect: 'mysql',
})

//Validate and Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((err) => {
    console.error('Oops! Failed to Connect', err);
})

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Find Student By Id
Student.findOne({ where: { id: 3 } }).then((student) => {
    console.log(student.get());
}).catch((err) => {
    console.error('Something went wrong:', err);
});

Выход

$ node student.findone
Executing (default): SELECT 1+1 AS result
Executing (default): SELECT `id`, `firstName`, `lastName
`, `createdAt`, `updatedAt` FROM `students` AS `student`
 WHERE `student`.`id` = 3;
App is successfully connected to the database.
{
  id: 3,
  firstName: 'Abdul',
  lastName: 'Kalam',
  createdAt: 2022-10-20T05:56:22.000Z,
  updatedAt: 2022-10-20T05:56:22.000Z
}

Sequelize с Async, Await

const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME, DATABASE_PASSWORD } = require('./config')

// Create Sequilize Instance
const sequelize = new Sequelize('student_database', DATABASE_NAME, DATABASE_PASSWORD, {
    host: 'localhost',
    dialect: 'mysql',
})

//Validate and Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((err) => {
    console.error('Oops! Failed to Connect', err);
})

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Get Students By Id
async function getStudentById() {
    let student = await Student.findOne({where:{id:3}});
    console.log(student.get());
}

getStudentById();

Выход

$ node student.findoneasync
Executing (default): SELECT 1+1 AS result
Executing (default): SELECT `id`, `firstName`, `lastName`, `createdAt`, `updatedAt` FROM 
`students` AS `student` WHERE `student`.`id` = 3;
App is successfully connected to the database.
{
  id: 3,
  firstName: 'Abdul',
  lastName: 'Kalam',
  createdAt: 2022-10-20T05:56:22.000Z,
  updatedAt: 2022-10-20T05:56:22.000Z
}

Количество секвенций

  • Мы используем метод count(), чтобы получить количество строк в таблице.
  • Мы создадим файл с именем countRow.js и добавим в него следующий код .
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME, DATABASE_PASSWORD } = require('./config')

// Create Sequilize Instance
const sequelize = new Sequelize('student_database', DATABASE_NAME, DATABASE_PASSWORD, {
    host: 'localhost',
    dialect: 'mysql',
})

//Validate and Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((err) => {
    console.error('Oops! Failed to Connect', err);
})

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Count no. of rows
Student.count()
    .then((res) => console.log(`There are ${res} rows in students table.`))
    .catch((err) => console.error(err))

Выход

$ node Countrow
Executing (default): SELECT 1+1 AS result
Executing (default): SELECT count(*) AS `count` FROM `st
udents` AS `student`;
App is successfuly connected to the database.
There are 5 rostudents'udents table.

Sequelize Удалить строку

  • Мы используем метод destroy() для удаления строки с использованием id .
  • Мы создадим файл с именем student.delete.js и добавим в него следующий код .
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME, DATABASE_PASSWORD } = require('./config')

// Create Sequilize Instance
const sequelize = new Sequelize('student_database', DATABASE_NAME, DATABASE_PASSWORD, {
    host: 'localhost',
    dialect: 'mysql',
})

//Validate and Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((err) => {
    console.error('Oops! Failed to Connect', err);
})

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Delete Student Row By Id
Student.destroy({ where: { id: 5 } })
    .then(() => {
        console.log('Row with selected id is deleted successfully.');
    })
    .catch((err) => {
        console.log(err);
    })

Выход

$ node student.delete
Executing (default): SELECT 1+1 AS result
Executing (default): DELETE FROM `students` WHERE `id` = 5
App is successfuly connected to the database.
Row with selected id is deleted successfully.

Sequelize Обновление строки

  • Мы используем метод update() для обновления строки с использованием id .
  • Мы создадим файл с именем student.update.js и добавим в него следующий код .
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME, DATABASE_PASSWORD } = require('./config')

// Create Sequilize Instance
const sequelize = new Sequelize('student_database', DATABASE_NAME, DATABASE_PASSWORD, {
    host: 'localhost',
    dialect: 'mysql',
})

//Validate and Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((err) => {
    console.error('Oops! Failed to Connect', err);
})

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Delete Student Row By Id
Student.update({ firstName: 'Rampal', lastName: 'Yadav' },
    { where: { id: 5 } })
    .then((response) => {
        console.log(`Student with ${response.id} row is updated`);
    })
    .catch((error) => {
        console.log(err);
    })

Выход

$ node student.update
Executing (default): SELECT 1+1 AS result
Executing (default): UPDATE `students` SET `firstName`=?,`lastName`=?,`updatedAt`=? WHERE
 `id` = ?
App is successfully connected to the database.
1 row is affected

Sequelize findAll

  • Мы используем findAll() для получения данных из всех строк.
  • Мы создадим файл с именем student.findAll.js и добавим в него следующий код .
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME, DATABASE_PASSWORD } = require('./config')

// Create Sequilize Instance
const sequelize = new Sequelize('student_database', DATABASE_NAME, DATABASE_PASSWORD, {
    host: 'localhost',
    dialect: 'mysql',
})

//Validate and Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((err) => {
    console.error('Oops! Failed to Connect', err);
})

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Find All Students
Student.findAll({ raw: true })
    .then((rows) => {
        console.log('List of All Students:', rows)
    })
    .catch((err) => {
        console.log(err)
    })

Вывод:

$ node student.findall
Executing (default): SELECT 1+1 AS result
Executing (default): SELECT `id`, `firstName`, `lastName`, `createdAt`, `updatedAt` FROM 
`students` AS `student`;
App is successfully connected to the database.
List of All Students: [
  {
    id: 1,
    firstName: 'Modi',
    lastName: 'Singh',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 2,
    firstName: 'Suhani',
    lastName: 'Shah',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 3,
    firstName: 'Abdul',
    lastName: 'Kalam',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 4,
    firstName: 'Shahrukh',
    lastName: 'Khan',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 5,
    firstName: 'Akshay',
    lastName: 'Kumar',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  }
]

Sequelize Select Columns с атрибутами

  • Мы передаем значение свойству attribute с помощью findAll() и находим строку с определенным полем столбца.
  • Мы создадим файл с именем student.findAllColAttr.js и добавим следующий код в файл student.findAllColAttr.js .
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME, DATABASE_PASSWORD } = require('./config')

// Create Sequilize Instance
const sequelize = new Sequelize('student_database', DATABASE_NAME, DATABASE_PASSWORD, {
    host: 'localhost',
    dialect: 'mysql',
})

//Validate and Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((err) => {
    console.error('Oops! Failed to Connect', err);
})

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Find All Students
Student.findAll({ attributes: ['id', 'lastName'], raw: true })
    .then((rows) => {
        console.log('List of All Students:', rows)
    })
    .catch((err) => {
        console.log(err)
    })

Вывод:

$ node student.findAllColAttr
Executing (default): SELECT 1+1 AS result
Executing (default): SELECT `id`, `firstName` FROM `students` AS `student`;
App is successfully connected to the database.
List of All Students: [
  { id: 1, firstName: 'Modi' },
  { id: 2, firstName: 'Suhani' },
  { id: 3, firstName: 'Abdul' },
  { id: 4, firstName: 'Shahrukh' },
  { id: 5, firstName: 'Akshay' }
]

Sequelize Order By Clause

  • Мы будем использовать свойство order с findAll() для получения всех строк в частичном использовании. Мы передаем значение свойству attribute с помощью findAll() rowsd для получения всех строк с определенным полем столбца.
  • Мы создадим файл с именем student.orderByClause.js и добавим следующий код в файл student.orderByClause.js .
const { Sequelize, DataTypes } = require('sequelize')
const { DATABASE_NAME, DATABASE_PASSWORD } = require('./config')

// Create Sequilize Instance
const sequelize = new Sequelize('student_database', DATABASE_NAME, DATABASE_PASSWORD, {
    host: 'localhost',
    dialect: 'mysql',
})

//Validate and Establish The Connection
sequelize.authenticate().then(() => {
    console.log('App is successfully connected to the database.');
}).catch((err) => {
    console.error('Oops! Failed to Connect', err);
})

// Define Student Model
const Student = sequelize.define('student', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
});

// Find All Students in Order By Clause
Student.findAll({ order: [['firstName', 'ASC']], raw: true })
    .then((rows) => {
        console.log('List of All Students:', rows)
    })
    .catch((err) => {
        console.log(err)
    })

Вывод

$ node student.orderByClause
Executing (default): SELECT 1+1 AS result
Executing (default): SELECT `id`, `firstName`, `lastName`, `createdAt`, `updatedAt` FROM 
`students` AS `student` ORDER BY `student`.`firstName` ASC;
App is successfully connected to the database.
List of All Students: [
  {
    id: 3,
    firstName: 'Abdul',
    lastName: 'Kalam',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 5,
    firstName: 'Akshay',
    lastName: 'Kumar',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 1,
    firstName: 'Modi',
    lastName: 'Singh',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 4,
    firstName: 'Shahrukh',
    lastName: 'Khan',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 2,
    firstName: 'Suhani',
    lastName: 'Shah',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  }
]
    id: 3,
    firstName: 'Abdul',
    lastName: 'Kalam',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 5,
    firstName: 'Akshay',
    lastName: 'Kumar',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 6,
    firstName: 'Lunar',
    lastName: 'Singh',
    createdAt: 2022-10-20T15:35:29.000Z,
    updatedAt: 2022-10-20T15:35:29.000Z
  },
  {
    id: 1,
    firstName: 'Modi',
    lastName: 'Singh',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 14,
    firstName: 'Praiksha',
    firstName: 'Shahrukh',
    lastName: 'Khan',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  },
  {
    id: 2,
    firstName: 'Suhani',
    lastName: 'Shah',
    createdAt: 2022-10-20T05:56:22.000Z,
    updatedAt: 2022-10-20T05:56:22.000Z
  }
]

Заключение

  • Sequelize — сторонний пакет, который использует объект для создания таблицы в базе данных.
  • Мы можем подключить приложение Node к базе данных и управлять базой данных без каких-либо команд.
  • Модель Sequelize определяет и описывает таблицу в базе данных.
  • Модуль типов данных Sequelize помогает контролировать типы данных свойств модели.
  • Методы, доступные в Sequelize, помогают управлять таблицами, строками и столбцами.
  • Мы можем установить связь между моделями, используя методы: belongsTo() , hasOne() , hasMoney() и belongsToMany() .