ruby-on-rails - type - rake db:create




如何在Ruby on Rails遷移中重命名數據庫列? (16)

我錯誤地命名了hased_password列而不是hashed_password

如何更新數據庫模式,使用遷移來重命名此列?


IMO,在這種情況下,更好地使用rake db:rollback 。 然後編輯您的遷移並再次輸入rake db:migrate 。 但是,如果列中的數據不想丟失,請使用rename_column


Rails 5遷移改變

例如:

rails g model學生student_name:字符串年齡:整數

如果您想要將student_name列更改為名稱

注意: - 如果你沒有運行rails db:migrate

您可以執行以下步驟

rails d model學生student_name:字符串年齡:整數

這將刪除生成的遷移文件,現在您可以更正您的列名稱

rails g model學生姓名:字符串年齡:整數

如果你遷移了(rails db:migrate),下面的選項可以更改列名

rails g migration RemoveStudentNameFromStudent student_name:string

rails g遷移AddNameToStudent name:string


更新 - create_table的近親是change_table,用於更改現有表。 它以與create_table類似的方式使用,但向該塊輸出的對象知道更多技巧。 例如:

class ChangeBadColumnNames < ActiveRecord::Migration
  def change
    change_table :your_table_name do |t|
      t.rename :old_column_name, :new_column_name
    end
  end
end

這種方式更有效率,如果我們使用其他改變方法,如:刪除/添加索引/刪除索引/添加列,例如我們可以做更進一步的如:

# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...

生成Ruby on Rails遷移

$:> rails g migration Fixcolumnname

在遷移文件(XXXXXfixcolumnname.rb)中插入代碼

class Fixcolumnname < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

作為一種替代方案,如果您沒有結合遷移的想法,ActiveRecord會有一個令人信服的gem,它將自動為您處理名稱更改Datamapper樣式。 你所做的只是改變模型中的列名(並確保你將Model.auto_upgrade!放在你的model.rb的底部)和中提琴! 數據庫即時更新。

https://github.com/DAddYE/mini_record

注意:您需要核實db / schema.rb以防止衝突

仍然處於測試階段,顯然不適合每個人,但仍然是一個引人注目的選擇(我目前在兩個不重要的生產應用程序中使用它,沒有任何問題)


你有兩種方法可以做到這一點:

  1. 在這種類型中,它在回滾時自動運行它的反向代碼。

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. 對於這種類型,當rake db:migrate運行up方法時rake db:migrate並在rake db:rollback時運行down方法:

    def self.up
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
    def self.down
      rename_column :table_name,:new_column_name,:old_column_name
    end
    

只需創建一個新的遷移,並在一個塊中使用rename_column ,如下所示。

rename_column :your_table_name, :hased_password, :hashed_password

如果你的代碼不與其他人共享,那麼最好的選擇就是做rake db:rollback然後編輯你的列名在遷移和rake db:migrate 。 而已

您可以編寫另一個遷移來重命名該列

 def change
    rename_column :table_name, :old_name, :new_name
  end

而已。


如果當前數據對您不重要,則可以使用以下命令取消原始遷移:

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

如果沒有引號,請在原始遷移中進行更改並通過以下方式再次運行向上遷移:

rake db:migrate

如果該列已經填充了數據並且處於生產階段,那麼我建議您逐步採取措施,以避免在等待遷移時停止生產。

首先,我將創建一個數據庫遷移,以添加具有新名稱的列,並使用舊列名稱中的值填充它們。

class AddCorrectColumnNames < ActiveRecord::Migration
  def up
    add_column :table, :correct_name_column_one, :string
    add_column :table, :correct_name_column_two, :string

    puts 'Updating correctly named columns'
    execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
    end
  end

  def down
    remove_column :table, :correct_name_column_one
    remove_column :table, :correct_name_column_two
  end
end

然後,我會承諾這一改變,並將改變推向生產。

git commit -m 'adding columns with correct name'

然後一旦提交被投入生產,我就會運行。

Production $ bundle exec rake db:migrate

然後我將所有引用舊列名的視圖/控制器更新為新的列名。 運行我的測試套件,並提交這些更改。 (確保它在本地工作並首先通過所有測試!)

git commit -m 'using correct column name instead of old stinky bad column name'

然後我會將這一承諾推向生產。

此時,您可以刪除原始列,而無需擔心與遷移本身相關的任何停機時間。

class RemoveBadColumnNames < ActiveRecord::Migration
  def up
    remove_column :table, :old_name_column_one
    remove_column :table, :old_name_column_two
  end

  def down
    add_column :table, :old_name_column_one, :string
    add_column :table, :old_name_column_two, :string
  end
end

然後將此最新遷移推送到生產環境,並在後台運行bundle exec rake db:migrate

我意識到這是一個更複雜的過程,但我寧願這樣做,而不是在生產遷移時遇到問題。


從API:

rename_column(table_name, column_name, new_column_name)

它重新命名一列,但保持類型和內容保持不變。


手動我們可以使用下面的方法:

我們可以手動編輯遷移,如下所示:

  • 打開app/db/migrate/xxxxxxxxx_migration_file.rb

  • hased_password更新為hashed_password

  • 運行以下命令

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

然後它會刪除你的遷移:

$> rake db:migrate:up VERSION=xxxxxxxxx

它將添加您的遷移與更新的更改。


某些版本的Ruby on Rails支持向上/向下的遷移方法,如果您在遷移過程中使用了向上/向下方法,則:

def up
    rename_column :table_name, :column_old_name, :column_new_name
end

def down
    rename_column :table_name, :column_new_name, :column_old_name
end

如果您在遷移中使用change方法,則:

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

有關更多信息,您可以移動: Ruby on Rails - 遷移活動記錄遷移


運行rails g migration ChangesNameInUsers (或任何你想命名它)

打開剛剛生成的遷移文件,並在方法中添加此行(在def changeend之間):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

保存該文件,然後在控制台中運行rake db:migrate

檢查你的schema.db以查看數據庫中名稱是否已經真正改變!

希望這可以幫助 :)


 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

$:  rails g migration RenameHashedPasswordColumn
invoke  active_record
      create    db/migrate/20160323054656_rename_hashed_password_column.rb

打開該遷移文件並修改該文件(請輸入您的原始表名)

class  RenameHashedPasswordColumn < ActiveRecord::Migration
  def change
    rename_column :table_name, :hased_password, :hashed_password
  end
end




migration