这两天听人推荐了 RoR Migration进行数据库变更自动化部署的法子,我自己实践了一把。由于学习成本和工作方式与团队现行方式差别较大,暂不考虑。以下内容取自我的数据库变更的自动化部署方案,虽然最终我们还是采用 SQL 方式操作,还是别浪费了我在 RoR Migration 的精力,特此总结。
=============华丽的分割线==============
RoR 全称是 Ruby on Rails,简单来说,基于 RoR Migration 进行数据库变更自动部署的思路是:
-
在本地使用 rails migration 生成 .rb 格式的变更文件;可以人工对变更文件进行编辑修改
-
变更提交至 gitlab,从而触发 Jenkins Job
-
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 Step1.安装 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 环境上执行。