# 迁移

我们的标语使用 database toolkit 代替 ORM 的原因是因为 Cotton 提供的不仅仅是 ORM。我们提供了一组工具,可帮助你管理使用数据库的 Deno 应用程序。我们希望确保你在开发应用程序时无需在多个工具中来回切换。

在本节中,我们将教你如何使用 Cotton 中的迁移功能。

# 什么是迁移?

如果你不知道什么是迁移,可以将其视为数据库的版本控制(例如[Git](https://git-scm.com))。假设你正在与团队合作。突然,你意识到 users 表中缺少 email 列。 此时,你可能会说 "好吧,我只需要告诉其他所有人在他们的数据库上运行此 SQL 查询语句,这样代码就可以工作!" 对吗?

但问题在于,无论你是开发小型练习项目还是大型企业项目,这种事情会一直发生。这就是为什么你需要考虑使用迁移的原因。当某人想要更改数据库中的某些内容时,他们要做的就是添加新迁移,该迁移将对数据库执行查询。

关于此功能的妙处,在于你不仅可以 使用 新的迁移,还可以 回滚 到数据库的先前版本。当出现问题时,这对于调试或回滚你的应用程序非常有用。

# 开始入门

你需要做的第一件事是安装 Cotton CLI。

$ deno install --allow-net --allow-read --allow-write -n cotton https://deno.land/x/cotton@v0.7.2/cli.ts

安装完成后,你可以在终端中键入 cotton 以验证是否安装成功。

$ cotton

Cotton CLI v0.1.0

Usage:
  cotton [command] [options]


Options:
  -h, --help
    Prints help information
  -c, --config
    Set the location of your database configuration (default: "ormconfig.json")


Commands:
  migration:create  Creates a new migration file
  migration:up      Apply all available migrations
  migration:down    Revert the last "batch" migrations
  migration:info    Get the status of all migrations

如你所见,我们有一堆命令可用于管理迁移。让我们从创建一个新的迁移文件开始。

# 创建迁移

$ cotton migration:create --name CreateUserTable

这条命令将在当前目录内创建一个包含迁移文件的 migrations/ 文件夹。这些文件中都有其自己的时间戳,可以帮助我们确定这些迁移的正确执行顺序。

$ tree migrations
migrations
└── 20200717134438_CreateUserTable.ts

让我们看一下迁移文件中的内容。

import { Schema } from "https://deno.land/x/cotton/mod.ts";

export async function up(schema: Schema) {
  // Do something...
}

export async function down(schema: Schema) {
  // Do something...
}

代码非常简单。 我们有一个 up 功能来 应用 此迁移到数据库,还有一个 down 功能来 恢复 到以前的版本。

要应用现有的迁移,你所要做的就是运行 cotton migration:up

$ cotton migration:up

Migrating: 20200717134438_CreateUserTable
Migrated:  20200717134438_CreateUserTable

返回数据库的先前版本也超级简单。

$ cotton migration:down

Reverting: 20200717134438_CreateUserTable
Reverted:  20200717134438_CreateUserTable

默认情况下,将还原到上一个迁移版本,该版本可以包含多个迁移。此外,你还可以通过传递 --steps 选项来指定要还原的迁移数量。

$ cotton migration:down --steps 1

# 迁移日志

你可以通过 migration:info 命令查看所有可用的迁移。这将打印出每个迁移,并检查是否已将其应用于数据库。

Applied  Migration
-------  ------------------------------
Yes      20200717134438_CreateUserTable