как правильно использовать миграции

#node.js #migration #sequelize.js

#node.js #миграция #sequelize.js

Вопрос:

Мой вопрос немного абстрактен, но я надеюсь, что это не слишком много.

Я создаю проект, который использует Sequelize как ORM. Это уже в рабочей среде, то есть в моей базе данных есть данные, которые НЕЛЬЗЯ удалить. Поскольку мы все еще разрабатываем, мне иногда нужно изменить базу данных (изменить столбец, добавить столбец, удалить столбец).

В проекте, который я использую sequelize.sync() . Единственным вариантом принудительного внесения изменений в базу данных является with sequelize.sync({force: true}) , но эта команда удаляет все данные из базы данных.

Насколько я понимаю, мне нужно использовать миграции. К сожалению, я прочитал документацию и заглянул в Stack Overflow, и я все еще не мог найти надлежащего руководства о том, как выполнить миграцию и сохранить ваши данные.

Допустим, у меня есть модель, User :

 module.exports = (sequelize, DataTypes) => {
  var Users = sequelize.define('user', {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      primaryKey: true
    },
    username: {
      type: DataTypes.STRING(20),
      unique: {
        msg: 'A person with the same username already exists!'
      },
      allowNull: false
    }, 
    password: {
      type: DataTypes.STRING(100),
      allowNull: false
    },
    phone: {
      type: DataTypes.STRING(50),
      allowNull: true,
      unique: {
        msg: 'A user with the same phone number already exists!'
      }
    }
  });

  Users.associate = function (models) {
    models.user.User_roles = models.user.belongsTo(models.user_role, {foreignKey: 'role'});

    models.user.Site_access = models.user.hasMany(models.site_access, {
      as: 'site_access',
      onDelete: "CASCADE",
      foreignKey: {
        allowNull: false
      }
    });
  };
  return Users;
};
  

Допустим, я хотел добавить столбец birthday TIMESTAMP , не удаляя все существующие данные, как я могу это сделать?

Ответ №1:

Добавьте столбцы в свою User таблицу и используйте alter

 sequelize.sync({
    force: false,
    alter: true
 })
  

alter True будет обновлять только новые столбцы или удаленные столбцы без удаления данных.

Комментарии:

1. О, действительно? а как насчет изменения столбца?

2. Если вы измените имя пользователя на имя, существующие данные столбца имени пользователя будут удалены, а столбец имени будет создан нулевым с помощью set defaultValue: null

3. Я вижу, так что это все еще опасно. Большое спасибо за вашу помощь! Я не могу найти никакой документации по этому свойству alter, так что вы действительно очень помогли.

4. да, изменение опасно для производства, будьте осторожны с этим. в любом случае я рад вам помочь 🙂

Ответ №2:

В качестве альтернативы вы также можете использовать CLI Sequelize вместо синхронизации моделей. Это позволяет вам также создавать более сложные миграции с откатами и обработчиками вместе с вашими моделями.

Комментарии:

1. Является ли sequelize-cli полной альтернативой системе models sync?

2. Вместо системы синхронизации. Я использую cli sequelize в своих проектах для написания миграций и создания сеялок. Это позволяет нам сохранять целостность данных и писать более сложную логику миграции за пределами столбцов. Sequelize init настроит нужные вам папки. Я думаю, вам просто нужно настроить конфигурационный файл.