技术开发 频道

DB2与Ruby on Rails入门


Team Room 例子

    现在可以开始执行实际的迁移步骤了。

步骤 1:创建 Documents 表

    首先需要从一个存储区开始,使所有文档和媒体文件在这个托管应用程序的用户之间共享。因此,首先创建 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
    注意,001_ create_docs_store.rb. 是在 db/migrate 中创建的,并且被编号为 ‘001’。从这一步开始,对于每个迁移步骤,db/migrate 中生成的文件依次递增编号。这表明 Rails 正在管理迁移的次序。

b) 像下面这样编辑 create_docs_store.rb:

清单 5. 编辑 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命令运行迁移:

清单 6. 运行第一个迁移,以创建 DOCUMENTS 表

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 表已创建:

清单 7. 列出被创建的 DB2 表

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 表如预期般被创建,并且数据类型如下:

清单 8. 检查为 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 表时可以得到如下输出:

清单 9. 查询 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 项目的第一个迁移。
0
相关文章