现在可以开始执行实际的迁移步骤了。
首先需要从一个存储区开始,使所有文档和媒体文件在这个托管应用程序的用户之间共享。因此,首先创建 DOCUMENTS 表,用于存储小组成员要共享的所有媒体文件。
我们定义以下列来描述共享文件的内容:
表 2. DOCUMENTS 表列和描述
列名 | 数据类型 | 描述 |
---|---|---|
ID | Integer | 主键 |
Name | VARCHAR | 文档名称 |
Size | Integer | 文件大小 |
Data | BLOB | 以二进制模式存储的文件,最大 2 M |
Content_type | VARCHAR | 文档类型,包括 .doc、.ppt、.pdf、.sw、.exe、.a、.so、 .gif、.jpeg、.mov、.avi、.mpeg、.bmp 等 |
a) 为了通过迁移的方式完成这个工作,执行ruby script\generate migration create_docs_store,以生成表 DOCUMENTS 的迁移。Rails 生成迁移,并创建 db/migrate/001_create_docs_store.rb。在 UNIX 上,可以输入ruby script/generate migration create_docs_store。(注意正斜杠 “/” 在 Windows 和 UNIX 上都适用。)
清单 4. 运行 ruby 脚本/生成迁移 create_docs_store
D:\rails\teamroom>ruby script/generate migration create_docs_store create db/migrate create db/migrate/001_create_docs_store.rb |
b) 像下面这样编辑 create_docs_store.rb:
class CreateDocsStore < ActiveRecord::Migration def self.up create_table :documents do |t| t.column :name, :string, :null => false t.column :size, :integer, :null => false t.column :content_type, :string, :null => false t.column :data, :binary, :limit => 2.megabytes end end def self.down drop_table :documents end end |
在 Rails 应用程序中,模式的更改是通过迁移发生的。对数据库的每次更改都被进行版本控制,并在包含独立于供应商的语法的 Ruby 脚本中定义。而且,每个迁移脚本提供两个类方法:up
方法和down
方法,这使得撤销更改与做出更改一样容易。对逻辑数据库模式做出更改所需的代码都放在self.up
方法中。而撤销更改所需的代码都放在self.down
方法中。
c) 通过rake db:migrate命令运行迁移:
D:\rails\teamroom>rake db:migrate (in D:/rails/teamroom) == CreateDocsStore: migrating ================================================= -- create_table(:documents) -> 0.2010s == CreateDocsStore: migrated (0.2010s) ======================================== |
d) 现在进入到 DB2 命令提示符下,发出db2 list tables for schema teamroom,以确认 DOCUMENTS 表已创建:
D:\>db2 list tables for schema teamroom Table/View Schema Type Creation time ------------------------------- --------------- ----- -------------------------- DOCUMENTS TEAMROOM T 2007-04-21-21.00.18.131001 SCHEMA_INFO TEAMROOM T 2007-04-21-21.00.17.740001 2 record(s) selected. |
注意,DOCUMENTS 表如预期般被创建,并且数据类型如下:
D:\>db2 describe table teamroom.documents Column Type Type name schema name Length Scale Nulls ------------------------------ --------- ------------------ -------- ----- ------ ID SYSIBM INTEGER 4 0 No NAME SYSIBM VARCHAR 255 0 No SIZE SYSIBM INTEGER 4 0 No DATA SYSIBM BLOB 2097152 0 Yes CONTENT_TYPE SYSIBM VARCHAR 255 0 No 5 record(s) selected. |
还需注意,在这个迁移期间,Rails 还创建了一个名为 SCHEMA_INFO 的表。SCHEMA_INFO 是通过rake db:migrate命令创建的。查询 SCHEMA_INFO 表时可以得到如下输出:
D:\>db2 select * from schema_info VERSION ----------- 1 1 record(s) selected. |
version 列中的值 ‘1’ 表明当前的迁移版本为 1(还记得之前曾运行过的 db/migrate/001_ create_docs_store.rb 吗)。
所以rake db:migrate实际上做以下事情:
- 创建 SCHEMA_INFO 表(如果该表不存在的话),并将值 ‘0’ 插入到 version 列中。
- 运行所有可应用的迁移。也就是说,运行编号大于当前迁移的所有迁移的
up
方法。第一个迁移从 version 值 ‘1’ 开始。 - 通过运行最新版本的迁移更新 SCHEMA_INFO 表。在上述例子中,version 被更新为 ‘1’,因为它是这个 Rails 项目的第一个迁移。