どのようにraketaskysでmigration対応のsqlを生成しますか?
5773 ワード
how-to-use-rake-tass-to-generate-migration-sql
Rakefileファイルにロードがあります。taskysの方法
http://api.rubyonrails.org/
http://guides.rubyonrails.org/command_ライン.
https://github.com/ruby/rake
http://eewang.github.io/blog/2013/07/29/how-to-use-rake-tasks-to-generate-migration-sql/
http://docs.seattlerb.org/rake/
コードを書き始めました。
lib/taskys/フォルダにmigrate.rakeを新規作成します。
機能の追加が見られます。
$rake db:drop
$rake db:create
$rake db:migrate:with_sql
$mysql-uroot-p ott_remote_cms_development$cat ugrade.sql
sqlをdbaに送ればいいです。本当に面倒くさいです。
Rakefileファイルにロードがあります。taskysの方法
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_ライン.
https://github.com/ruby/rake
http://eewang.github.io/blog/2013/07/29/how-to-use-rake-tasks-to-generate-migration-sql/
http://docs.seattlerb.org/rake/
コードを書き始めました。
lib/taskys/フォルダに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};
" }
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
sqlをdbaに送ればいいです。本当に面倒くさいです。