我应该保持 Sequelize 模型和迁移同步吗?

Exi*_*stX 4 database postgresql node.js sequelize.js

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

但是我不确定在哪里声明列选项(notNull、references、validate、ENUM 值等...)

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

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

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

任何帮助,将不胜感激!

L. *_*yer 5

我看到了您可以采取的三个选项。前两个选项可能是边缘情况,但有助于理解。

破坏性选择

您想对项目进行原型设计并且不介意丢失数据,那么您可能不关心迁移文件并根据您的模型同步您的数据库:

await sequelize.sync({ force: true });
Run Code Online (Sandbox Code Playgroud)

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

DROP TABLE IF EXISTS "your_model" CASCADE;
CREATE TABLE IF NOT EXISTS "your_model" (...)
Run Code Online (Sandbox Code Playgroud)

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


 静态选项

正如您提到的,您不想添加列和内容,这可能是一个不错的选择。

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

DROP TABLE IF EXISTS "your_model" CASCADE;
CREATE TABLE IF NOT EXISTS "your_model" (...)
Run Code Online (Sandbox Code Playgroud)

它只会生成:

CREATE TABLE IF NOT EXISTS "your_model" (...)
Run Code Online (Sandbox Code Playgroud)

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

但是,如果您想修改模型并且它是最常见的用例,则不会在表中动态生成新列,这就是您需要迁移脚本的原因。


灵活的选择

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

# npx sequelize-cli init or create migrations and models folders
npx sequelize-cli model:generate --name User --attributes firstName:string,email:string
Run Code Online (Sandbox Code Playgroud)

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

await sequelize.sync({ });
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE IF NOT EXISTS "your_model" (...)
Run Code Online (Sandbox Code Playgroud)

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


Ana*_*oly 2

您应该在两者中都执行此操作,因为随着时间的推移,您的模型和初始迁移将彼此不同。所以我想您应该确定模型中的最终结构,然后创建初始迁移。