首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该保持序列化模型和迁移同步吗?

我应该保持序列化模型和迁移同步吗?
EN

Stack Overflow用户
提问于 2020-05-21 01:59:27
回答 3查看 853关注 0票数 5

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

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

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

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

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

任何帮助都将不胜感激!

EN

回答 3

Stack Overflow用户

发布于 2020-05-29 15:58:46

我认为你可以选择三个选项。前两个选项可能是边缘情况,但它有助于理解。

破坏性选项

你想要一个项目的原型,并且你不介意丢失你的数据,那么你可能不关心迁移文件,并根据你的模型同步你的数据库:

代码语言:javascript
复制
await sequelize.sync({ force: true });

它将在您的所有模型上执行:

代码语言:javascript
复制
DROP TABLE IF EXISTS "your_model" CASCADE;
CREATE TABLE IF NOT EXISTS "your_model" (...)

例如,此命令可以在应用程序启动时执行。

静态选项

正如你提到的,你不想添加列和东西,这可能是一个好的选择。

现在,如果您不想丢失数据,您可以简单地使用不带force选项的sync方法:

代码语言:javascript
复制
await sequelize.sync({ });

它只会生成:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS "your_model" (...)

因此,您的表是根据您的模型创建的,您不必创建迁移文件。

然而,如果你想修改你的模型并且它是最常用的用例,新的列将不会在表中动态生成,这就是为什么你需要迁移脚本的原因。

灵活的选项

您必须同时定义迁移文件和模型。这就是cli所做的。下面是一个示例:

代码语言:javascript
复制
# npx sequelize-cli init or create migrations and models folders
npx sequelize-cli model:generate --name User --attributes firstName:string,email:string

现在,您将拥有另外两个文件:

代码语言:javascript
复制
// 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'); 
  }
};
代码语言:javascript
复制
// 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;
};

您可以重构迁移和模型中的代码,但是这将相当繁琐,因为一些迁移文件只会添加一列,因此将它们全部合并到模型中可能不太清楚。

票数 5
EN

Stack Overflow用户

发布于 2020-05-21 02:15:39

你应该在两者中都这样做,因为随着时间的推移,你的模型和初始迁移将会彼此不同。因此,我认为您应该确定模型中的最终结构,然后创建初始迁移。

票数 2
EN

Stack Overflow用户

发布于 2020-05-27 03:52:02

约束是在SQL级别定义和运行的,而验证是在应用程序级别运行的。Sequelize支持对模型进行验证和约束,只有约束可以在迁移中定义。

我的观点是将所有约束放在迁移中,并将验证放在模型中。这样,在对运行约束的数据库进行查询之前运行验证时,就有了某种关注点的分离。您可以阅读有关Sequelize的验证和约束Validations and Constraints的更多信息

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61919784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档