迁移

原文:https://gobuffalo.io/documentation/database/migrations/

Migrations 迁移

Software maintenance is a hard task, and you’ll probably need to patch your database to add, modify or remove some fields. The way to handle that with Pop is to use migrations.

​ 软件维护是一项艰巨的任务,您可能需要修补数据库以添加、修改或删除某些字段。使用 Pop 处理此问题的方法是使用迁移。

You can create new migrations using fizz, a custom language describing the database changes in the most database-agnostic way; or use SQL statements if you prefer.

​ 您可以使用 fizz 创建新迁移,这是一种自定义语言,以最与数据库无关的方式描述数据库更改;或者如果您愿意,可以使用 SQL 语句。

Writing Migrations 编写迁移

Note for Buffalo users: soda commands are embedded into the buffalo command, behind the pop namespace. So every time you want to use a command from soda, just execute buffalo pop instead. Buffalo 用户须知: soda 命令嵌入到 buffalo 命令中,位于 pop 命名空间之后。因此,每次您想使用 soda 中的命令时,只需执行 buffalo pop 即可。

Fizz Migrations Fizz 迁移

The soda command will generate SQL migrations (both the up and down) files for you.

soda 命令将为您生成 SQL 迁移(向上和向下)文件。

1
$ soda generate fizz name_of_migration

Running this command will generate the empty following files:

​ 运行此命令将生成以下空文件:

1
2
./migrations/20220706213354_name_of_migration.up.fizz
./migrations/20220706213354_name_of_migration.down.fizz

The generated files are fizz files. Pop uses Fizz to generate migrations that are both easy to work with and work across multiple types of databases.

​ 生成的文件是 fizz 文件。Pop 使用 Fizz 生成易于使用且适用于多种类型数据库的迁移。

Further info about this command can be found by using the --help flag:

​ 有关此命令的更多信息,可以使用 --help 标志找到:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ soda g migration --help
Generates Up/Down migrations for your database using fizz.

Usage:
  soda generate fizz [name] [flags]

Aliases:
  fizz, migration

Flags:
  -h, --help   help for fizz

Global Flags:
  -c, --config string   The configuration file you would like to use.
  -d, --debug           Use debug/verbose mode
  -e, --env string      The environment you want to run migrations against. Will use $GO_ENV if set. (default "development")
  -p, --path string     Path to the migrations folder (default "./migrations")

By default, the migration will create an UUID id that serves as the primary key, as well as created_at and updated_at datetime columns, so there is no need to create your own. These are the default, but you can override them if you want. 默认情况下,迁移将创建一个用作主键的 UUID id ,以及 created_atupdated_at datetime 列,因此无需创建自己的。这些是默认值,但您可以根据需要覆盖它们。

SQL Migrations SQL 迁移

If you don’t want to use Fizz, or you have a complicated query you want to execute, you can use SQL.

​ 如果您不想使用 Fizz,或者您有想要执行的复杂查询,则可以使用 SQL。

To generate a new empty migration, use the following command:

​ 要生成一个新的空迁移,请使用以下命令:

1
$ soda generate sql name_of_migration

Running this command will generate the following files:

​ 运行此命令将生成以下文件:

1
2
./migrations/20220706213354_name_of_migration.up.sql
./migrations/20220706213354_name_of_migration.down.sql

Further info about this command can be found by using the --help flag:

​ 有关此命令的更多信息,可以使用 --help 标志找到:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ soda g sql --help
Generates Up/Down migrations for your database using SQL.

Usage:
  soda generate sql [name] [flags]

Flags:
  -h, --help   help for sql

Global Flags:
  -c, --config string   The configuration file you would like to use.
  -d, --debug           Use debug/verbose mode
  -e, --env string      The environment you want to run migrations against. Will use $GO_ENV if set. (default "development")
  -p, --path string     Path to the migrations folder (default "./migrations")

Running Migrations 运行迁移

Note for Buffalo users: soda commands are embedded into the buffalo command, behind the pop namespace. So every time you want to use a command from soda, just execute buffalo pop instead. Buffalo 用户须知: soda 命令嵌入到 buffalo 命令中,位于 pop 命名空间之后。因此,每次您想使用 soda 中的命令时,只需执行 buffalo pop 即可。

Apply Migrations 应用迁移

Once migrations have been created they can be run with either of the following commands:

​ 创建迁移后,可以使用以下任一命令运行它们:

1
2
$ soda migrate
$ soda migrate up

Both commands are identical, one is shorter to type! Migrations will be run in sequential order.

​ 这两个命令是相同的,一个更短,更容易输入!迁移将按顺序运行。

Rollback a Migration 回滚迁移

If you want to rollback the last applied migration, use the following command:

​ 如果您想回滚上次应用的迁移,请使用以下命令:

1
$ soda migrate down

More information about the migration command be found by running:

​ 有关迁移命令的更多信息,可以通过运行以下命令找到:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ soda migrate --help
Runs migrations against your database.

Usage:
  soda migrate [flags]
  soda migrate [command]

Aliases:
  migrate, m

Available Commands:
  down        Apply one or more of the 'down' migrations.
  status      Displays the status of all migrations.
  up          Apply one or more of the 'up' migrations.

Flags:
  -h, --help   help for migrate

Global Flags:
  -c, --config string   The configuration file you would like to use.
  -d, --debug           Use debug/verbose mode
  -e, --env string      The environment you want to run migrations against. Will use $GO_ENV if set. (default "development")
  -p, --path string     Path to the migrations folder (default "./migrations")

Use "soda migrate [command] --help" for more information about a command.

Targeting a Database 针对数据库

Since Pop v4.4.0, migrations can target a specific database, using a suffix. This allows to use commands specific to a dialect, only for a given database.

​ 自 Pop v4.4.0 起,迁移可以使用后缀针对特定数据库。这允许仅针对给定数据库使用特定于方言的命令。

For instance, if you want to support both PostgreSQL and MySQL, you can create two migrations:

​ 例如,如果您想同时支持 PostgreSQL 和 MySQL,则可以创建两个迁移:

  • my-migration.mysql.up.sql and my-migration.mysql.down.sql will be used when migrating a MySQL database. my-migration.mysql.up.sqlmy-migration.mysql.down.sql 将在迁移 MySQL 数据库时使用。
  • my-migration.postgres.up.sql and my-migration.postgres.down.sql will be used when migrating a PostgreSQL database. my-migration.postgres.up.sqlmy-migration.postgres.down.sql 将在迁移 PostgreSQL 数据库时使用。

If no version for the dialect can be found, Pop will fallback to the non-suffixed version, if it exists.

​ 如果找不到方言的版本,Pop 将回退到非后缀版本(如果存在)。

Custom Migrations Table 自定义迁移表

By default, the applied migrations are tracked in the table schema_migration. This table is created by pop if it doesn’t exist.

​ 默认情况下,已应用的迁移会在表 schema_migration 中进行跟踪。如果该表不存在,则由 pop 创建该表。

In some cases, though, you may want to use a different name for this table. Since pop v4.5.0, you can customize the name of this table using the migration_table_name option. The example below will use migrations as the table name:

​ 但在某些情况下,您可能希望为此表使用不同的名称。自 pop v4.5.0 起,您可以使用 migration_table_name 选项自定义此表的名称。以下示例将使用 migrations 作为表名:

1
2
3
4
5
development:
  dialect: "postgres"
  url: "your_db_development"
  options:
    migration_table_name: migrations

Migrations Once Deployed 已部署的迁移

When you build your app, the migrations are stored inside your binary. Your binary has a hidden migrate command baked in that performs the migrations, just like it does when you use buffalo pop migrate:

​ 构建应用时,迁移存储在二进制文件中。您的二进制文件内置了一个隐藏的 migrate 命令,用于执行迁移,就像您使用 buffalo pop migrate 时一样:

1
2
3
4
5
6
7
8
9
$ ./myapp migrate
DEBU[2018-01-12T06:14:20Z] select count(*) as row_count from (SELECT schema_migration.* FROM schema_migration AS schema_migration WHERE version = ?) a $1=20171213171622
DEBU[2018-01-12T06:14:20Z] select count(*) as row_count from (SELECT schema_migration.* FROM schema_migration AS schema_migration WHERE version = ?) a $1=20171213172104
DEBU[2018-01-12T06:14:20Z] select count(*) as row_count from (SELECT schema_migration.* FROM schema_migration AS schema_migration WHERE version = ?) a $1=20171213172249
DEBU[2018-01-12T06:14:20Z] select count(*) as row_count from (SELECT schema_migration.* FROM schema_migration AS schema_migration WHERE version = ?) a $1=20171213173148
DEBU[2018-01-12T06:14:20Z] select count(*) as row_count from (SELECT schema_migration.* FROM schema_migration AS schema_migration WHERE version = ?) a $1=20171219070903
DEBU[2018-01-12T06:14:20Z] select count(*) as row_count from (SELECT schema_migration.* FROM schema_migration AS schema_migration WHERE version = ?) a $1=20171219071524

0.0010 seconds
最后修改 February 4, 2024: 更新 (c4156b3)