gpt4 book ai didi

node.js - 我应该让 Sequelize 模型和迁移保持同步吗?

转载 作者:行者123 更新时间:2023-12-03 20:06:47 26 4
gpt4 key购买 nike

一般来说,我是 Sequelize.js 和数据库的新手,我之前没有使用过迁移,但我知道它们可以用来以非破坏性的方式更改表结构。

但是我不确定在哪里声明列选项(notNull、引用、验证、ENUM 值等......)

我应该在模型文件或迁移文件中声明这些选项吗?或两者?

将选项添加到模型和迁移不会导致重复代码吗?

(请记住,我说的是为数据库创建表的初始迁移,而不是添加列和内容的迁移......)

任何帮助,将不胜感激!

最佳答案

我看到你可以采取三个选择。前两个选项可能是极端情况,但有助于理解。
破坏性选择
您想对项目进行原型(prototype)设计并且不介意丢失数据,那么您可能不关心迁移文件并根据您的模型同步您的数据库:

await sequelize.sync({ force: true });
它将在您的所有模型上执行:
DROP TABLE IF EXISTS "your_model" CASCADE;
CREATE TABLE IF NOT EXISTS "your_model" (...)
例如,可以在应用程序启动时执行此命令。

静态选项
正如您提到的,您不想添加列和内容,这可能是一个不错的选择。
现在,如果您不想丢失数据,您可以简单地使用不带 force 选项的同步方法:
await sequelize.sync({ });
它只会生成:
CREATE TABLE IF NOT EXISTS "your_model" (...)
因此,您的表是根据您的模型创建的,您不必创建迁移文件。
但是, 如果你想修改你的模型这是最常见的用例,新列不会在表中动态生成,这就是您需要迁移脚本的原因。

灵活的选择
您必须同时定义迁移文件和模型。这就是 cli做。这是一个例子:
# npx sequelize-cli init or create migrations and models folders
npx sequelize-cli model:generate --name User --attributes firstName:string,email:string
现在您将有两个文件:
// migrations/<date>-create-user.js
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
firstName: {
type: Sequelize.STRING
},
email: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
// I usually remove this and create the table only if not exists
return queryInterface.dropTable('Users');
}
};
// models/users.js
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', {
firstName: DataTypes.STRING,
email: DataTypes.STRING
}, {});
User.associate = function(models) {
// associations can be defined here
};
return User;
};
您可以从迁移和模型中重构代码,但这会相当麻烦,因为某些迁移文件只会添加一列,因此将它们全部合并到模型中可能不太清楚。

关于node.js - 我应该让 Sequelize 模型和迁移保持同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61919784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com