как правильно использовать миграции - PullRequest
0 голосов
/ 10 апреля 2019

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

Я строю проект, использующий Sequelize, поскольку это ORM.Он уже находится в производстве, что означает, что у меня есть данные в моей базе данных, которые НЕ МОГУТ быть удалены.Поскольку мы все еще развиваемся, мне иногда нужно изменить базу данных (изменить столбец, добавить столбец, удалить столбец).

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

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

Допустим, у меня есть модель, 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 без стирания всех существующих данных, как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

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

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

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

0 голосов
/ 11 апреля 2019

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

...