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

Последнее обновление: 24.11.2023

Ключевым компонентом в работе Sequelize с бд являются модели. Модели описывают стуктуру хранящихся в бд данных. Кроме того, через модели в основном идет взаимодействие с бд.

Есть два способа определения моделей. Первый способ представляет использование метода define(). Например, определим модель User, которая представляет пользователя:

const User = sequelize.define("user", {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true,
    allowNull: false
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false
  },
  age: {
    type: Sequelize.INTEGER,
    allowNull: false
  }
});

Первый параметр метода - это название модели. В данном случае модель называется "user". Важно учитывать, что если в бд для этой модели нет таблицы, то она будет создаваться. Причем в качестве имени таблицы будет применяться название модели во множественном числе в соответствии с правилами английского языка. То есть в данном случае таблица будет называться "users". Это следует учитывать при наименовании моделей.

Второй параметр метода define() задает структуру модели, то есть описывает ее поля. Для каждого поля определяется ряд атрибутов. Атрибут type указывает на тип поля. В данном случае поля id и age представляют тип INTEGER, то есть целое число, а поле name - тип STRING, то есть строку.

Сопоставление некоторых типов sequelize с типами SQL:

Sequelize

SQL

Sequelize.STRING

VARCHAR(255)

Sequelize.STRING.BINARY

VARCHAR BINARY

Sequelize.TEXT

TEXT

Sequelize.INTEGER

INTEGER

Sequelize.FLOAT

FLOAT

Sequelize.DOUBLE

DOUBLE

Sequelize.DECIMAL

DECIMAL

Sequelize.BOOLEAN

TINYINT(1)

Полный набор типов и их сопоставление с типами SQL можно посмотреть в документации.

Дополнительно для поля можно задать еще ряд атрибутов. Атрибут allowNull указывает, допускает ли поле отсутствие значение. По умолчанию имеет значение true - то есть у поля может отсутствовать значение. Значение false указывает, что поле обязательно должно иметь какое-либо значение.

Для поля id в данном случае также задается еще пара атрибутов. Атрибут autoIncrement: true указывает, что значение столбца в таблице в БД будет автоинкрементироваться, а атрибут primaryKey: true говорит о том, что соответствующий столбец в таблице будет выполнять роль первичного ключа.

Второй способ определения модели:

class User extends Model {}
User.init({
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true,
    allowNull: false
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false
  },
  age: {
    type: Sequelize.INTEGER,
    allowNull: false
  }
}, {
  sequelize,
  modelName: "user"
});

Синхронизация с бд

Перед началом взаимодействия с бд нам надо убедиться, что таблицы в базе данных соответствуют определению наших моделей. Для синхронизации выполняется метод sync:

sequelize.sync().then(result=>{
  console.log(result);
})
.catch(err=> console.log(err));

Метод sync() синхронизирует структуру базы данных с определением моделей. Например, если для какой-то модели отстуствует соответствующая таблица в БД, то эта таблица создается.

Полный код приложения:

const Sequelize = require("sequelize");
const sequelize = new Sequelize({
  dialect: "sqlite",
  storage: "metanit.db"
});

class User extends Model {}
const User = sequelize.define("user", {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true,
    allowNull: false
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false
  },
  age: {
    type: Sequelize.INTEGER,
    allowNull: false
  }
});

sequelize.sync().then(result=>{
  console.log(result);
})
.catch(err=> console.log(err));

Следует учитывать, что кроме собственно полей модели в таблице по умолчанию будут создаваться два дополнительных поля: createdAt и updatedAt, которые будут иметь тип datetime и будут представлять соответственно время создания и последнего обновления строки в таблице.

Например, при работе с базой данных SQLite фактически созданная таблица будет описываться следующим скриптом:

CREATE TABLE IF NOT EXISTS `users` (
  `id` INTEGER PRIMARY KEY AUTOINCREMENT, 
  `name` VARCHAR(255) NOT NULL, 
  `age` INTEGER NOT NULL, 
  `createdAt` DATETIME NOT NULL, 
  `updatedAt` DATETIME NOT NULL
);

Более того, нам не обязательно определять в модели поле id, так как sequelize по умолчанию также будет создавать подобное поле, которое будет выполнять роль первичного ключа.

Также можно вручную создать таблицу на сервере и потом к ней подключаться без необходимости синхронизации.

Но, возможно, нам не нужны эти дополнительные столбцы createdAt и updatedAt. В этом случае при определении объекта Sequelize нам надо задать параметр define: {timestamps: false}:

const Sequelize = require("sequelize");
const sequelize = new Sequelize({
    dialect: "sqlite",
    storage: "metanit.db",
    define: {
        timestamps: false
    }
});
const User = sequelize.define("user", {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true,
    allowNull: false
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false
  },
  age: {
    type: Sequelize.INTEGER,
    allowNull: false
  }
});
sequelize.sync().then(result=>console.log(result))
.catch(err=> console.log(err));

Еси в бд есть подобная таблица, но она не соответствует определению модели, то мы можем использоать параметр {force: true}, чтобы удалить таблицы и создать их заново, но уже с нужной нам структурой:

sequelize.sync({force: true}).then(result=>{
  console.log(result);
})
.catch(err=> console.log(err));
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850