基于 RoR Migration 的数据库变更

2017-06-29  籽藤 

这两天听人推荐了 RoR Migration进行数据库变更自动化部署的法子,我自己实践了一把。由于学习成本和工作方式与团队现行方式差别较大,暂不考虑。以下内容取自我的数据库变更的自动化部署方案,虽然最终我们还是采用 SQL 方式操作,还是别浪费了我在 RoR Migration 的精力,特此总结。

=============华丽的分割线==============

RoR 全称是 Ruby on Rails,简单来说,基于 RoR Migration 进行数据库变更自动部署的思路是:

  1. 在本地使用 rails migration 生成 .rb 格式的变更文件;可以人工对变更文件进行编辑修改

  2. 变更提交至 gitlab,从而触发 Jenkins Job

  3. Jenkins Job 通过执行 rake db:migrate 命令即可执行变更

NOTE:RoR Migration 对团队工作方式改动较大,可作为后期自动化选型的参考,不作为当前的实施重点。

2.1 RoR Migration 的好处

2.1.1 对数据库操作版本控制

对数据库变更自动生成版本号,可以通过以下命令更新到最新版本,更新到指定版本,回退 N 个版本等等。

rake db:migrate

rake db:migrate VERSION=20170628093554

rake db:rollback STEP=3

2.1.2 完整记录数据库操作的执行时间

通过 rake db:migrate 生效的数据库操作,均在 rails 应用的 logs 目录中有记录。

2.1.3 支持各种高级功能

通过编辑 migrate 文件,方便完成各种逻辑判断。例如:

# Check a column exists

column_exists?(:suppliers,:name)

# Check a column exists of a particular type

column_exists?(:suppliers,:name,:string)

# Check a column exists with a specific definition

column_exists?(:suppliers,:name,:string,limit:100)

column_exists?(:suppliers,:name,:string,default:'default')

column_exists?(:suppliers,:name,:string,null:false)

column_exists?(:suppliers,:tax,:decimal,precision:8,scale:2)

2.1.4 通过命令在多个环境中执行数据库操作

可以在 config/database.yml 中配置多个数据库连接,通过 rake db:migrate RAILS_ENV={环境名称} 对多个环境执行数据库操作

2.2 RoR Migration 的使用

官方教程:http://guides.rubyonrails.org/v3.2/migrations.html

2.2.1 Step By Step

1.安装 ruby,rails 模块,mysql 模块。MacOs 上命令如下:

brew install rbenv
rbenv install 2.4.0
rbenv global 2.4
gem install rails
gem install mysql2

2. 基于 rails 生成一个项目:

rails new ~/Documents/iCode/Ruby/mydb

3. 编辑 config/database.yml 文件,示例如下。可使用格式校验工具,确认没有语法错误: http://www.yamllint.com/

development:
adapter: mysql2
database: api
password: your_pwd
pool: 5
timeout: 5000
port: 3306
host: 127.0.0.1
username: root

4. 以“新增字段”举例,先使用命令创建数据库操作的变更文件,文件存放在 db/migrate 目录中。

rails g migration add_fieldname_to_tablename fieldname:string

5. 查看 migrate 文件,根据需要编辑。

6. 使用 rake db:migrate ,则执行数据库变更。默认是在 development 环境上执行。

72°|716 人阅读|1 条评论

邓智群  2017-06-29

登录 后发表评论