2013-07-11 61 views
1

我想知道是否有辦法獲得遷移的create table語句。因此,不要只運行rake db:migrate,如果您可以編寫某些內容來調用遷移,而不是運行或停止運行,則可以運行它,但不必創建表,而只需取得create table語句。有沒有辦法讓遷移的create table語句

有點像Createfootable.up,並能夠具體如果我想爲SQLite或MySQL的創建表語句等,這可能嗎?

+0

不知道我找到你。如果你想看到,只需打開相應的文件。 –

+0

我不清楚你爲什麼想要這個,但是我什麼都不知道:)你可以通過config> locals> database.yml來改變你的生產/開發/測試數據庫......會滿足你的要求嗎?需要嗎? – SteveTurczyn

+0

可能幫助:http://justatheory.com/computers/databases/postgresql/rails_and_slony.html#referrer=simononsoftware.com(查找文本'desc「通過猴子補丁運行遷移」)' – Zabba

回答

3

這些是2個獨立的問題:

  1. 我可以生成一個查詢字符串(或一組查詢字符串)從遷移?
  2. 我可以在運行遷移(或從中生成查詢)時選擇使用哪個適配器?

這兩個答案的簡短答案是「是的,你可以」。

class CreateFoosTable < ActiveRecord::Migration 
    def up 
    create_table :foo do |t| 
     t.int :bar 
     t.string :baz 
    end 
    end 
end 

先回答第二個問題,你可以通過改變用於建立連接的ActiveRecord的配置開關適配器:

mysql_config = { 
    adapter: "mysql", 
    host:  "localhost", 
    username: "myuser", 
    password: "mypass", 
    database: "somedatabase" 
} 
sqlite_config = { 
    adapter: "sqlite", 
    database: "path/to/dbfile"  
} 

require "db/migrate/20130711000000_create_foos_table.rb" 
ActiveRecord::Base.establish_connection(mysql_config) 
CreateFoosTable.up  # run against mysql 
ActiveRecord::Base.establish_connection(sqlite_config) 
CreateFoosTable.up  # run against sqlite 

現在你的第一個問題,我怎麼能生成SQL代替實際執行它?

最簡單的方法是重寫execute方法輸出無論是在傳遞:

# replace 'SQLiteAdapter' with AbstractMysqlAdapter to do the same for MySQL 
ActiveRecord::ConnectionAdapters::SQLiteAdapter.class_eval do 
    def execute(sql, name=nil) 
    puts sql 
    end 
end 

運行CreateFoosTable.up現在應該輸出的SQL安慰。如果要將SQL字符串捕獲到某個變量,請用適合您需要的任何邏輯來替換puts sql

請注意,儘管覆蓋execute將適用於create_table,但它不會正確執行修改現有表的工作。這是因爲在生成修改SQL之前需要execute來確定現有模式。在這種情況下,在繼續之前,最好使用別名並檢查查詢是以CREATEALTER還是DROP開頭。

+0

美.................... – beck03076

+0

我不知道我是否需要知道這一切,但我知道它。 –

相關問題