Sequelize 是一款 Node.js 的 ORM 框架,可以操作多种关系型数据库,包括 PostgreSQL、MySQL、SQLite 和 Microsoft SQL Server 等。其中,数据迁移是大型项目必不可少的一部分,让我们来看看如何使用 Sequelize 进行数据库迁移。
数据库迁移的重要性
在大型项目中,数据库结构通常会经常进行修改。这些修改可能包括添加、删除、修改表格或其列,或者创建、删除索引等。手动管理这些变化是一项繁琐的任务,而且容易出错。而数据迁移技术可以大大简化这个过程,通过编写可重复执行的脚本来处理各种数据库结构变化。
如果没有数据迁移技术,那么在项目发生变化时,开发人员可能会花费大量时间调整数据库结构。尤其是在开发团队中有多个人员共同开发时,数据迁移能够保证数据库结构的一致性。
数据库迁移操作
一个数据库迁移操作通常包括以下步骤:
- 创建一个新版本的数据库结构,如添加新的表格、列或索引。
- 更新现有的数据库结构,如从现有表格中删除列,或者修改当前的索引定义。
- 向现有数据中填充新的数据,如向添加的表格中插入新的数据行。
Sequelize 提供了与上述步骤相对应的一些功能,以便简化数据库迁移的过程,我们来逐步了解。
使用 Sequelize 进行数据库迁移
1. 安装必要的依赖
首先,我们需要在项目中安装必要的依赖。
npm install sequelize-cli sequelize mysql2 --save
sequelize-cli
包提供了使用 Sequelize 进行数据库迁移的必要命令。sequelize
是 Sequelize 框架的核心包。mysql2
则是 Sequelize 支持的 MySQL 数据库的驱动程序。
2. 配置 Sequelize
接下来,我们需要配置 Sequelize 的连接信息。请创建一个名为 .sequelizerc
的文件,并将以下内容添加到该文件中:
const path = require('path'); module.exports = { 'config': path.resolve('config', 'config.json'), 'models-path': path.resolve('models'), 'seeders-path': path.resolve('seeders'), 'migrations-path': path.resolve('migrations') };
如上所示,我们指定了我们的配置文件、模型文件、迁移文件和数据填充文件所在的位置。
接下来,我们创建一个 config.json
的配置文件,这个文件用来配置数据库连接信息和 Sequelize 的基本设置。我们在这里使用 MySQL 数据库。
-- -------------------- ---- ------- - -------------- - ----------- ------- ----------- --- ----------- -------- ------- ------------ ---------- -------- ------------------- ----- -- ------- - ----------- ------- ----------- --- ----------- ------------- ------- ------------ ---------- -------- ---------- ----- -- ------------- - ----------- ------- ----------- --- ----------- ------------------- ------- ------------ ---------- -------- ------------------- ----- - -
3. 创建初始的数据库结构
接下来,我们需要创建 Sequelize 模型,其中包括定义数据库表的字段和属性。
请创建一个名为 User.js
的文件,并添加以下代码:
-- -------------------- ---- ------- -------------- - ----------- ---------- -- - ----- ---- - ------------------------ - --- - ----- ------------------ -------------- ----- ----------- ---- -- ----- - ----- ----------------- ---------- ------ -- ------ - ----- ----------------- ---------- ------ ------- ----- -- --------- - ----- ----------------- ---------- ------ -- ---------- - ----- --------------- ------------- -------------- -- ---------- - ----- --------------- ------------- -------------- - --- ------ ----- -
如上所述, User.js
定义了 User 模型,该模型将被转换为 Users
表。该表有一个自增长字段 id
,我们还定义了用于用户名、电子邮件、密码、创建时间和更新时间的其他字段。
我们还需要为 User
模型创建一个迁移文件,来定义如何在数据库中创建 Users
表。请使用以下命令为 User
模型创建一个新的迁移文件:
npx sequelize migration:create --name=create-user
运行上述命令后会创建一个新的迁移文件,名为 XXXXXXXXXXXXXX-create-user.js
。我们将它重命名为 20221031124700-create-user.js
(其中的数字随意),并添如下内容:
-- -------------------- ---- ------- ---- -------- -------------- - - --- ---------------- ---------- -- - ----------------------------------- - --- - ----- ------------------ -------------- ----- ----------- ---- -- ----- - ----- ----------------- ---------- ------ -- ------ - ----- ----------------- ---------- ------ ------- ----- -- --------- - ----- ----------------- ---------- ------ -- ---------- - ----- --------------- ------------- -------------- -- ---------- - ----- --------------- ------------- -------------- - -- -- ----- ---------------- ---------- -- - ---------------------------------- - --
上述迁移文件定义了如何创建和删除 Users
表。up
方法定义了创建表的逻辑,down
方法定义了删除表的逻辑。
我们使用 queryInterface
对象来执行数据库相关操作。在本例中,我们使用 createTable
方法来创建 Users
表,使用 dropTable
方法来删除 Users
表。
4. 安装数据填充
在代码安装完毕后,我们可以用数据填充技术来添加初试的数据。请使用以下命令为 User 模型创建一个新的数据填充文件:
npx sequelize seed:generate --name init-users
运行上述命令后会创建一个新的数据填充文件,名为 XXXXXXXXXXXXXX-init-users.js
。我们将其重命名为 20221031152226-init-users.js
(日期随意),并添加以下内容:
-- -------------------- ---- ------- ---- -------- -------------- - - --- ---------------- ---------- -- - ------ ---------------------------------- -- ----- ------- ------ ---------------- --------- --------- ---------- --- ------- ---------- --- ------ -- - ----- ------ ------ --------------- --------- --------- ---------- --- ------- ---------- --- ------ --- ---- -- ----- ---------------- ---------- -- - ------ ---------------------------------- ----- ---- - --
上述数据填充文件定义了 up
方法,用于向 Users
表中添加两个数据。我们使用 queryInterface.bulkInsert
方法来批量插入初始数据,使用 queryInterface.bulkDelete
方法来删除这个初始数据。
5. 运行数据库迁移
现在我们已经定义了一个数据库模型,接下来我们可以执行迁移任务,使用以下命令:
npx sequelize db:migrate
运行上述命令后,Sequelize 将自动处理我们定义的的数据库迁移,并创建 Users 表和添加数据。
6. 数据库迁移进行到一半
如果你已经运行了一些数据库迁移,现在需要新增一个新的迁移并修改现有的表格。在这种情况下,最好使用一个新的迁移而不是修改现有的迁移。
请使用以下命令,为 User 模型创建一个新的数据库迁移文件:
npx sequelize migration:create --name=add-age-to-user
运行上述命令后,将创建一个新的迁移,名为 XXXXXXXXXXXXXX-add-age-to-user.js
。我们将其重命名为 20221031171015-add-age-to-user.js
(日期随意),并添加以下内容:
-- -------------------- ---- ------- ---- -------- -------------- - - --- ---------------- ---------- -- - ------ --------------------------------- ------ ------------------- -- ----- ---------------- ---------- -- - ------ ------------------------------------ ------- - --
up
方法使用 queryInterface.addColumn
方法将一个新的字段 age
添加到 Users 表中,down
方法使用 queryInterface.removeColumn
方法从 Users 表中删除 age
字段。
7. 回退数据库迁移
如果迁移过程出现问题需要回退,在 Sequelize 中执行回退十分简单。请使用以下命令:
npx sequelize db:migrate:undo
运行上述命令会回退最新的数据库迁移。
结论
Sequelize 提供了强大的数据库迁移工具,能够在进行数据库结构变更时方便地管理和追踪变更历史。在大型项目中使用 Sequelize 进行数据迁移,能够避免出现错误,并保持数据库结构的一致性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670f926d5f55128102657f3b