how-to-use-rake-tasks-to-generate-migration-sql

Rakefile文件里有load_tasks的方法

http://api.rubyonrails.org/

Load Rake, railties tasks and invoke the registered hooks. Check Rails::Railtie.rake_tasks for more info.

Source: hide | on GitHub

# File railties/lib/rails/engine.rb, line 451
def load_tasks(app=self)
require "rake"
run_tasks_blocks(app)
self
end
rake_tasks(&block)
If you try to define a set of rake tasks on the instance,
these will get passed up to the rake tasks defined on the application's class. Source: hide | on GitHub # File railties/lib/rails/application.rb, line 270
def rake_tasks(&block)
self.class.rake_tasks(&block)
end

相关文档

http://guides.rubyonrails.org/command_line.html

https://github.com/ruby/rake

http://eewang.github.io/blog/2013/07/29/how-to-use-rake-tasks-to-generate-migration-sql/

开始写代码了。

在lib/tasks/文件夹新建migrate.rake

# 根据下面的博客做了一点点修改
# http://eewang.github.io/blog/2013/07/29/how-to-use-rake-tasks-to-generate-migration-sql/
namespace :db do
[ :migrate, :rollback ].each do |n|
namespace n do |migration_task|
# original_task = migration_task.instance_variable_get("@scope").join ":" [:with_sql, :to_sql ].each do |t|
desc "Run migration, and generated SQL" if t == :with_sql
desc "Generate migration SQL" if t == :to_sql
task t => :environment do |sql_task|
original_task = sql_task.name.sub(":#{t}", '') case original_task
when 'db:migrate'
filename = 'upgrade.sql'
when 'db:rollback'
filename = 'rollback.sql'
else
raise "unkown migration type #{original_task}"
end ActiveRecord::Base.connection.class.class_eval do
# alias the adapter's execute for later use
alias :old_execute :execute
            SQL_FILENAME = filename
RUN_SQL = sql_task.name.ends_with?("with_sql") # define our own execute
def execute(sql, name = nil)
# check for some DDL and DML statements
if /^(create|alter|drop|insert|delete|update)/i.match sql
File.open(SQL_FILENAME, 'a') { |f| f.puts "#{sql};\n" }
old_execute sql, name if RUN_SQL
else
# pass everything else to the aliased execute
old_execute sql, name
end
end end # create or delete content of migration.sql
File.open(SQL_FILENAME, 'w') { |f| f.puts "-- Script created @ #{Time.now}" } # invoke the normal migration procedure now
Rake::Task[original_task].invoke puts "Ran #{original_task} and wrote sql to #{filename}"
end
end
end
end
end

这时候来执行$ rake -T db

可以看到新增的功能

rake db:create              # Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all t...
rake db:drop # Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to dr...
rake db:fixtures:load # Load fixtures into the current environment's database
rake db:migrate # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)
rake db:migrate:status # Display status of migrations
rake db:migrate:to_sql # Generate migration SQL
rake db:migrate:with_sql # Run migration, and generated SQL
rake db:rollback # Rolls the schema back to the previous version (specify steps w/ STEP=n)
rake db:rollback:to_sql # Generate migration SQL
rake db:rollback:with_sql # Run migration, and generated SQL

$ mysqldump -uroot -p ott_remote_cms_development > back.sql

$ rake db:drop

$ rake db:create

$ rake db:migrate:with_sql

$ mysql -uroot -p ott_remote_cms_development < back.sql

$ cat upgrade.sql

把sql发给dba就可以了,确实太麻烦了。

如何用rake tasks 生成migration对应的sql的更多相关文章

  1. 如何用JavaDoc命令生成帮助文档

    如何用JavaDoc命令生成帮助文档 文档注释 在代码中使用文档注释的方法 /** *@author *@version * */ 生成帮助文档 打开java文件所在位置,在路径前加入cmd (注意有 ...

  2. VS2010 根据模型生成数据库 打开edmx.sql文件时 vs出现无响应的解决方案

    今天在VS2010 sp1+sql server 2008 R2+Win7操作系统下测试ADO.NET 实体数据模型时 ,遇到这样一个问题. 首先建好实体模型,然后"根据模型生成数据库&qu ...

  3. (转载)根据数据字典表定义的表结构,生成创建表的SQL语句

    <来源网址:http://www.delphifans.com/infoview/Article_221.html>根据数据字典表定义的表结构,生成创建表的SQL语句 //1.  类名:T ...

  4. PHP通过(PDO)Mysql表字段一键生成创建sqlite的SQL

    首发于:http://www.zzzzy.com/201406053158.html /** * Mysql表字段一键生成创建sqlite的SQL 2 * @author: Skiychan < ...

  5. MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具

    这里向大家介绍一个新的生成T-SQL脚本的SQL Server命令行工具:mssql-scripter.它支持在SQL Server.Azure SQL DB以及Azure SQL DW中为数据库生成 ...

  6. Navicat生成数据库结构同步SQL

    作为一个苦逼的技术男,在做开发的时候经常会遇见程序版本升级,数据库结构变化.我们需要一个快捷的方式让客户尽快从旧版本数据库结构更新至新版本数据库结构.如果每做一次改动我们就记录一下当然是好事,但是万一 ...

  7. 让er studio 生成带说明的sql

    一直使用er studion 来建数据库的模型图. 用了几年苦于 erstudion 不能生成带说明注释的sql 语句,每次生成实体之后都要自己去加注释. 今天根据外国朋友的资料找到了办法 需要自己建 ...

  8. Excel生成Oracle数据库表sql工具类

    1.解决问题: 开发文档中字段比较多的时候,建表sql(Oracle下划线命名规范)比较麻烦,容易出错~~ (主要是懒) 特意手写一个工具,根据excel字段,生成建表的sql语句. ~~~末尾附Gi ...

  9. 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)【转】

    本文转载自:https://www.leiphone.com/news/201703/Y5vnDSV9uIJIQzQm.html 生成对抗网络(Generative Adversarial Netwo ...

随机推荐

  1. 【BZOJ 1019】【SHOI2008】汉诺塔(待定系数法递推)

    1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 559  Solved: 341[Submit][Status] ...

  2. [poj1742]coin

    题意:多重背包的w=v特殊情况 分析:此题如果用单调队列O(nv)会被无耻卡常数…… 然后鉴于此题W=V,所以只存在背包恰好为i的是否存在,即bool型的f[i]是否为1 即往背包染色上面考虑 如果是 ...

  3. __weak typeof(self) weakSelf = self

    typeof(self) 是获取到self的类型,这样定义出的weakSelf就是和self一个类型的, 加上__weak是建立一个若引用,整句就是给self定义了一个若引用性质的替身;这个一般用在使 ...

  4. Daily Scrum – 1/11

    Meeting Minutes 发现了一个新的bug,即当背诵单词过多时,会出现统计信息超出文字框的现象: 更新了tfs,明白了打包的方式: Burndown     Progress   part ...

  5. iOS开发中的错误整理,线程之间通信练习,加载图片的练习中出现的错误 -- Http请求错误

    控制台打印:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it i ...

  6. Java基础-JVM类加载机制

    JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述: 1)Bootstrap ClassLoader /启动类加载器 $JAVA_HOME中jre/li ...

  7. VB中的属性、方法和事件概念解析

    Visual Basic 语言中的所有对象都有它们自己的属性.方法和事件,其中包括窗体和控件.可以将属性视为对象的特性,将方法视为对象的操作,而将事件视为对象的响应. 日常生活中的对象(如氦气球)也具 ...

  8. 【SGU 104】Little shop of flowers

    题意 每个花按序号顺序放到窗口,不同窗口可有不同观赏值,所有花都要放上去,求最大观赏值和花的位置. 分析 dp,dp[i][j]表示前i朵花最后一朵在j位置的最大总观赏值. dp[i][j]=max( ...

  9. Azure怎么使用ftp登录

    1.下载配置文件 2.拷贝FTP的地址 3.查看配置文件里面的用户名和密码 4.登录

  10. BZOJ4241 历史研究

    Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...