数据库迁移Database Migrations

迁移是一个方便的结构化的和有组织的方式来改变数据库。

Migrations are a convenient way for you to alter your database in a structured and organized manner.

重要: 迁移在 Phalcon Developer Tools 中可用。需要使用最新的框架,php框架要求PHP 5.4及以上。

Important: Migrations are available on Phalcon Developer Tools You need at least Phalcon Framework version 0.5.0 to use developer tools. Also is recommended to have PHP 5.4 or greater installed.

通常在开发中我们需要更新生产环境。这些变化可能是数据库修改包括字段,新建表,删除索引,等。

Often in development we need to update changes in production environments. Some of these changes could be database modifications like new fields, new tables, removing indexes, etc.

迁移时生成的一组类来描述如何创建数据库结构。这些类可用于将我们数据库的变化同步到远程生产服务器上。使用纯PHP描述这些迁移转换。

When a migration is generated a set of classes are created to describe how your database is structured at that moment. These classes can be used to synchronize the schema structure on remote databases setting your database ready to work with the new changes that your application implements. Migrations describe these transformations using plain PHP.

数据定义导出Schema Dumping

Phalcon Developer Tools 提供了脚本去管理迁移(生成, 运行和回滚).

The Phalcon Developer Tools provides scripts to manage migrations (generation, running and rollback).

可用生成迁移的选项:

The available options for generating migrations are:

../_images/migrations-1.png

如果不使用参数运行。将会导出所有对象(表和视图)到迁移类文件。

Running this script without any parameters will simply dump every object (tables and views) from your database in migration classes.

每个迁移都有一个版本符号。版本数字用于鉴定迁移比当前数据库的版本是旧还是新。版本号还会告诉Phalcon执行迁移的顺序。

Each migration has a version identifier associated to it. The version number allows us to identify if the migration is newer or older than the current ‘version’ of our database. Versions also inform Phalcon of the running order when executing a migration.

../_images/migrations-2.png

生成的迁移时,指令显示在控制台来描述不同的迁移步骤,这些语句的执行时间。最后生成迁移版本。

When a migration is generated, instructions are displayed on the console to describe the different steps of the migration and the execution time of those statements. At the end, a migration version is generated.

默认 Phalcon Developer Tools 使用*app/migrations*作为迁移文件导出目录。可以通过设置参数改变导出的路径。数据库中的每个表都会导出一个单独的文件在版本号目录中。

By default Phalcon Developer Tools use the app/migrations directory to dump the migration files. You can change the location by setting one of the parameters on the generation script. Each table in the database has its respective class generated in a separated file under a directory referring its version:

../_images/migrations-3.png

迁移类剖析Migration Class Anatomy

每个文件包含一个唯一的类继承自Phalcon\Mvc\Model\Migration。类有两个方法up() 和 down()。Up() 执行迁移, down() 提供回滚。

Each file contains a unique class that extends the Phalcon\Mvc\Model\Migration These classes normally have two methods: up() and down(). Up() performs the migration, while down() rolls it back.

Up()包含了一个魔术方法morphTable()。 神奇的是它根据描述去同步改变实际数据库的表。

Up() also contains the magic method morphTable(). The magic comes when it recognizes the changes needed to synchronize the actual table in the database to the description given.

  1. <?php
  2. use Phalcon\Db\Column as Column;
  3. use Phalcon\Db\Index as Index;
  4. use Phalcon\Db\Reference as Reference;
  5. class ProductsMigration_100 extends \Phalcon\Mvc\Model\Migration
  6. {
  7. public function up()
  8. {
  9. $this->morphTable(
  10. "products",
  11. array(
  12. "columns" => array(
  13. new Column(
  14. "id",
  15. array(
  16. "type" => Column::TYPE_INTEGER,
  17. "size" => 10,
  18. "unsigned" => true,
  19. "notNull" => true,
  20. "autoIncrement" => true,
  21. "first" => true,
  22. )
  23. ),
  24. new Column(
  25. "product_types_id",
  26. array(
  27. "type" => Column::TYPE_INTEGER,
  28. "size" => 10,
  29. "unsigned" => true,
  30. "notNull" => true,
  31. "after" => "id",
  32. )
  33. ),
  34. new Column(
  35. "name",
  36. array(
  37. "type" => Column::TYPE_VARCHAR,
  38. "size" => 70,
  39. "notNull" => true,
  40. "after" => "product_types_id",
  41. )
  42. ),
  43. new Column(
  44. "price",
  45. array(
  46. "type" => Column::TYPE_DECIMAL,
  47. "size" => 16,
  48. "scale" => 2,
  49. "notNull" => true,
  50. "after" => "name",
  51. )
  52. ),
  53. ),
  54. "indexes" => array(
  55. new Index(
  56. "PRIMARY",
  57. array("id")
  58. ),
  59. new Index(
  60. "product_types_id",
  61. array("product_types_id")
  62. )
  63. ),
  64. "references" => array(
  65. new Reference(
  66. "products_ibfk_1",
  67. array(
  68. "referencedSchema" => "invo",
  69. "referencedTable" => "product_types",
  70. "columns" => array("product_types_id"),
  71. "referencedColumns" => array("id"),
  72. )
  73. )
  74. ),
  75. "options" => array(
  76. "TABLE_TYPE" => "BASE TABLE",
  77. "ENGINE" => "InnoDB",
  78. "TABLE_COLLATION" => "utf8_general_ci",
  79. )
  80. )
  81. );
  82. }
  83. }

类名叫做”ProductsMigration_100”。100尾缀表示版本号为1.0.0。 morphTable() 接受包含四个板块的数组。

The class is called “ProductsMigration_100”. Suffix 100 refers to the version 1.0.0. morphTable() receives an associative array with 4 possible sections:

IndexDescriptionOptional
“columns”An array with a set of table columnsNo
“indexes”An array with a set of table indexes.Yes
“references”An array with a set of table references (foreign keys).Yes
“options”An array with a set of table creation options. These options are often related to the database system in which the migration was generated.Yes

定义列Defining Columns

Phalcon\Db\Column 被用于定义表的列。它封装了列的一系列的功能。接受第一个参数作为列名。一个数组作为列的描述。下面是列描述的参数。

Phalcon\Db\Column is used to define table columns. It encapsulates a wide variety of column related features. Its constructor receives as first parameter the column name and an array describing the column. The following options are available when describing columns:

OptionDescriptionOptional
“type”Column type. Must be a Phalcon_Db_Column constant (see below)No
“size”Some type of columns like VARCHAR or INTEGER may have a specific sizeYes
“scale”DECIMAL or NUMBER columns may be have a scale to specify how much decimals it must storeYes
“unsigned”INTEGER columns may be signed or unsigned. This option does not apply to other types of columnsYes
“notNull”Column can store null values?Yes
“autoIncrement”With this attribute column will filled automatically with an auto-increment integer. Only one column in the table can have this attribute.Yes
“first”Column must be placed at first position in the column orderYes
“after”Column must be placed after indicated columnYes

数据库迁移支持以下数据列类型:

Database migrations support the following database column types:

  • Phalcon\Db\Column::TYPE_INTEGER
  • Phalcon\Db\Column::TYPE_DATE
  • Phalcon\Db\Column::TYPE_VARCHAR
  • Phalcon\Db\Column::TYPE_DECIMAL
  • Phalcon\Db\Column::TYPE_DATETIME
  • Phalcon\Db\Column::TYPE_CHAR
  • Phalcon\Db\Column::TYPE_TEXT

定义索引Defining Indexes

Phalcon\Db\Index 定义数据库表的索引。索引只需要你为它定义一个名称和一个列表的列。注意,如果任何索引的名称为PRIMARY,Phalcon将创建一个表的主键索引。

Phalcon\Db\Index defines table indexes. An index only requires that you define a name for it and a list of its columns. Note that if any index has the name PRIMARY, Phalcon will create a primary key index in that table.

定义关系Defining References

:doc:`Phalcon\Db\Reference <../api/Phalcon_Db_Reference>`定义表引用(也称为外键)。以下选项可用于定义一个引用:

Phalcon\Db\Reference defines table references (also called foreign keys). The following options can be used to define a reference:

IndexDescriptionOptional
“referencedTable”It’s auto-descriptive. It refers to the name of the referenced table.No
“columns”An array with the name of the columns at the table that have the referenceNo
“referencedColumns”An array with the name of the columns at the referenced tableNo
“referencedTable”The referenced table maybe is on another schema or database. This option allows you to define that.Yes

创建迁移类Writing Migrations

迁移并不是只为了“变形”表。迁移只是一个常规PHP类所以你不限于这些函数。例如添加一列之后您可以编写代码来为现有的记录设置列的值。更多的细节和例子查看 database component

Migrations aren’t only designed to “morph” table. A migration is just a regular PHP class so you’re not limited to these functions. For example after adding a column you could write code to set the value of that column for existing records. For more details and examples of individual methods, check the database component.

  1. <?php
  2. class ProductsMigration_100 extends \Phalcon\Mvc\Model\Migration
  3. {
  4. public function up()
  5. {
  6. //...
  7. self::$_connection->insert(
  8. "products",
  9. array("Malabar spinach", 14.50),
  10. array("name", "price")
  11. );
  12. }
  13. }

执行迁移Running Migrations

生成的迁移上传目标服务器,可以很容易地运行它们,如下面例子所示:

Once the generated migrations are uploaded on the target server, you can easily run them as shown in the following example:

../_images/migrations-4.png

../_images/migrations-5.png

取决于数据库是否过时来执行迁移,在同一个迁移过程Phalcon可能运行多个迁移版本。如果你指定一个目标版本,Phalcon将运行所需的迁移直到到达指定的版本。

Depending on how outdated is the database with respect to migrations, Phalcon may run multiple migration versions in the same migration process. If you specify a target version, Phalcon will run the required migrations until it reaches the specified version.