我想知道是否有辦法獲得遷移的create table語句。因此,不要只運行rake db:migrate,如果您可以編寫某些內容來調用遷移,而不是運行或停止運行,則可以運行它,但不必創建表,而只需取得create table語句。有沒有辦法讓遷移的create table語句
有點像Createfootable.up,並能夠具體如果我想爲SQLite或MySQL的創建表語句等,這可能嗎?
我想知道是否有辦法獲得遷移的create table語句。因此,不要只運行rake db:migrate,如果您可以編寫某些內容來調用遷移,而不是運行或停止運行,則可以運行它,但不必創建表,而只需取得create table語句。有沒有辦法讓遷移的create table語句
有點像Createfootable.up,並能夠具體如果我想爲SQLite或MySQL的創建表語句等,這可能嗎?
這些是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
來確定現有模式。在這種情況下,在繼續之前,最好使用別名並檢查查詢是以CREATE
,ALTER
還是DROP
開頭。
美.................... – beck03076
我不知道我是否需要知道這一切,但我知道它。 –
不知道我找到你。如果你想看到,只需打開相應的文件。 –
我不清楚你爲什麼想要這個,但是我什麼都不知道:)你可以通過config> locals> database.yml來改變你的生產/開發/測試數據庫......會滿足你的要求嗎?需要嗎? – SteveTurczyn
可能幫助:http://justatheory.com/computers/databases/postgresql/rails_and_slony.html#referrer=simononsoftware.com(查找文本'desc「通過猴子補丁運行遷移」)' – Zabba