#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 настроит нужные вам папки. Я думаю, вам просто нужно настроить конфигурационный файл.