迁移
就像你使用 版本控制 系统(例如 Git)来管理源代码中的更改一样,你可以使用迁移来跟踪数据库的更改。通过迁移,你可以将现有数据库转移到另一个状态,反之亦然:这些状态转换保存在迁移文件中,这些文件描述了如何到达新状态以及如何恢复更改以返回到旧状态。
¥Just like you use version control systems such as Git to manage changes in your source code, you can use migrations to keep track of changes to the database. With migrations you can transfer your existing database into another state and vice versa: Those state transitions are saved in migration files, which describe how to get to the new state and how to revert the changes in order to get back to the old state.
你将需要 Sequelize 命令行接口 (CLI)。CLI 支持迁移和项目引导。
¥You will need the Sequelize Command-Line Interface (CLI). The CLI ships support for migrations and project bootstrapping.
Sequelize 中的迁移是一个 javascript 文件,它导出两个函数 up
和 down
,指示如何执行迁移和撤消迁移。你手动定义这些函数,但 不手动调用它们;CLI 将自动调用它们。在这些函数中,你只需借助 sequelize.query
以及 Sequelize 提供给你的其他方法即可执行你需要的任何查询。除此之外没有额外的魔法。
¥A Migration in Sequelize is a javascript file which exports two functions, up
and down
, that dictates how to perform the migration and undo it. You define those functions manually, but you don't call them manually; they will be called automatically by the CLI. In these functions, you should simply perform whatever queries you need, with the help of sequelize.query
and whichever other methods Sequelize provides to you. There is no extra magic beyond that.
安装 CLI
¥Installing the CLI
要安装 Sequelize CLI:
¥To install the Sequelize CLI:
npm install --save-dev sequelize-cli
详细信息请参见 CLI GitHub 存储库。
¥For details see the CLI GitHub repository.
项目引导
¥Project bootstrapping
要创建一个空项目,你需要执行 init
命令
¥To create an empty project you will need to execute init
command
npx sequelize-cli init
这将创建以下文件夹
¥This will create following folders
-
config
,包含配置文件,告诉 CLI 如何连接数据库¥
config
, contains config file, which tells CLI how to connect with database -
models
,包含你项目的所有模型¥
models
, contains all models for your project -
migrations
,包含所有迁移文件¥
migrations
, contains all migration files -
seeders
,包含所有种子文件¥
seeders
, contains all seed files
配置
¥Configuration
在继续之前,我们需要告诉 CLI 如何连接到数据库。为此,我们打开默认配置文件 config/config.json
。它看起来像这样:
¥Before continuing further we will need to tell the CLI how to connect to the database. To do that let's open default config file config/config.json
. It looks something like this:
{
"development": {
"username": "root",
"password": null,
"database": "database_development",
"host": "127.0.0.1",
"dialect": "mysql"
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
请注意,Sequelize CLI 默认假定使用 mysql。如果你使用其他方言,则需要更改 "dialect"
选项的内容。
¥Note that the Sequelize CLI assumes mysql by default. If you're using another dialect, you need to change the content of the "dialect"
option.
现在编辑此文件并设置正确的数据库凭据和方言。对象的键(例如 "development")在 model/index.js
上用于匹配 process.env.NODE_ENV
(未定义时,"development" 是默认值)。
¥Now edit this file and set correct database credentials and dialect. The keys of the objects (e.g. "development") are used on model/index.js
for matching process.env.NODE_ENV
(When undefined, "development" is a default value).
Sequelize 将使用每种方言的默认连接端口(例如,对于 postgres,它是端口 5432)。如果你需要指定不同的端口,请使用 "port"
字段(默认情况下 config/config.js
中不存在该字段,但你可以简单地添加它)。
¥Sequelize will use the default connection port for each dialect (for example, for postgres, it is port 5432). If you need to specify a different port, use the "port"
field (it is not present by default in config/config.js
but you can simply add it).
注意:如果你的数据库还不存在,你可以调用 db:create
命令。通过适当的访问,它将为你创建该数据库。
¥Note: If your database doesn't exist yet, you can just call db:create
command. With proper access it will create that database for you.
创建第一个模型(和迁移)
¥Creating the first Model (and Migration)
正确配置 CLI 配置文件后,你就可以创建第一个迁移了。就像执行一个简单的命令一样简单。
¥Once you have properly configured CLI config file you are ready to create your first migration. It's as simple as executing a simple command.
我们将使用 model:generate
命令。该命令需要两个选项:
¥We will use model:generate
command. This command requires two options:
-
name
:型号名称;¥
name
: the name of the model; -
attributes
:模型属性列表。¥
attributes
: the list of model attributes.
让我们创建一个名为 User
的模型。
¥Let's create a model named User
.
npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string
这会:
¥This will:
-
在
models
文件夹下创建模型文件user
;¥Create a model file
user
inmodels
folder; -
在
migrations
文件夹中创建名称类似于XXXXXXXXXXXXXX-create-user.js
的迁移文件。¥Create a migration file with name like
XXXXXXXXXXXXXX-create-user.js
inmigrations
folder.
注意:Sequelize 将仅使用模型文件,它是表表示。另一方面,迁移文件是该模型或更具体地说由 CLI 使用的表的更改。将迁移视为数据库中某些更改的提交或日志。
¥Note: Sequelize will only use Model files, it's the table representation. On the other hand, the migration file is a change in that model or more specifically that table, used by CLI. Treat migrations like a commit or a log for some change in database.
运行迁移
¥Running Migrations
直到这一步,我们还没有向数据库中插入任何内容。我们刚刚为我们的第一个模型 User
创建了所需的模型和迁移文件。现在要在数据库中实际创建该表,你需要运行 db:migrate
命令。
¥Until this step, we haven't inserted anything into the database. We have just created the required model and migration files for our first model, User
. Now to actually create that table in the database you need to run db:migrate
command.
npx sequelize-cli db:migrate
该命令将执行以下步骤:
¥This command will execute these steps:
-
将确保数据库中有一个名为
SequelizeMeta
的表。该表用于记录当前数据库上运行了哪些迁移¥Will ensure a table called
SequelizeMeta
in database. This table is used to record which migrations have run on the current database -
开始查找尚未运行的所有 迁移文件。这可以通过检查
SequelizeMeta
表来实现。在这种情况下,它将运行我们在上一步中创建的XXXXXXXXXXXXXX-create-user.js
迁移。¥Start looking for any migration files which haven't run yet. This is possible by checking
SequelizeMeta
table. In this case it will runXXXXXXXXXXXXXX-create-user.js
migration, which we created in last step. -
创建一个名为
Users
的表,其中包含其迁移文件中指定的所有列。¥Creates a table called
Users
with all columns as specified in its migration file.
撤消迁移
¥Undoing Migrations
现在我们的表已经创建并保存在数据库中。通过迁移,你只需运行命令即可恢复到旧状态。
¥Now our table has been created and saved in the database. With migration you can revert to old state by just running a command.
你可以使用 db:migrate:undo
,该命令将恢复最近的迁移。
¥You can use db:migrate:undo
, this command will revert the most recent migration.
npx sequelize-cli db:migrate:undo
你可以通过使用 db:migrate:undo:all
命令撤消所有迁移来恢复到初始状态。你还可以通过使用 --to
选项传递迁移名称来恢复到特定迁移。
¥You can revert back to the initial state by undoing all migrations with the db:migrate:undo:all
command. You can also revert back to a specific migration by passing its name with the --to
option.
npx sequelize-cli db:migrate:undo:all --to XXXXXXXXXXXXXX-create-posts.js
创建第一个种子
¥Creating the first Seed
假设我们想默认向几个表中插入一些数据。如果我们继续前面的示例,我们可以考虑为 User
表创建一个演示用户。
¥Suppose we want to insert some data into a few tables by default. If we follow up on the previous example we can consider creating a demo user for the User
table.
要管理所有数据迁移,你可以使用播种器。种子文件是数据的一些更改,可用于使用示例或测试数据填充数据库表。
¥To manage all data migrations you can use seeders. Seed files are some change in data that can be used to populate database tables with sample or test data.
让我们创建一个种子文件,它将向 User
表添加一个演示用户。
¥Let's create a seed file which will add a demo user to our User
table.
npx sequelize-cli seed:generate --name demo-user
此命令将在 seeders
文件夹中创建一个种子文件。文件名类似于 XXXXXXXXXXXXXX-demo-user.js
。它遵循与迁移文件相同的 up / down
语义。
¥This command will create a seed file in seeders
folder. File name will look something like XXXXXXXXXXXXXX-demo-user.js
. It follows the same up / down
semantics as the migration files.
现在我们应该编辑此文件以将演示用户插入到 User
表中。
¥Now we should edit this file to insert demo user to User
table.
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.bulkInsert('Users', [
{
firstName: 'John',
lastName: 'Doe',
email: 'example@example.com',
createdAt: new Date(),
updatedAt: new Date(),
},
]);
},
down: (queryInterface, Sequelize) => {
return queryInterface.bulkDelete('Users', null, {});
},
};
运行种子
¥Running Seeds
在上一步中,你创建了一个种子文件;但是,它尚未提交到数据库。为此,我们运行一个简单的命令。
¥In last step you created a seed file; however, it has not been committed to the database. To do that we run a simple command.
npx sequelize-cli db:seed:all
这将执行该种子文件,并且演示用户将被插入到 User
表中。
¥This will execute that seed file and a demo user will be inserted into the User
table.
注意:与使用 SequelizeMeta
表的迁移不同,播种器执行历史记录不会存储在任何地方。如果你想更改此行为,请阅读 Storage
部分。
¥Note: Seeder execution history is not stored anywhere, unlike migrations, which use the SequelizeMeta
table. If you wish to change this behavior, please read the Storage
section.
消除种子
¥Undoing Seeds
如果播种机正在使用任何存储空间,则可以撤消播种机。有两个命令可用于此:
¥Seeders can be undone if they are using any storage. There are two commands available for that:
如果你想撤消最近的种子: