我错误地将列命名为hased_password而不是hashed_password

如何使用迁移重命名此列来更新数据库架构?


#1楼

如果当前数据对您不重要,您可以使用以下方法删除原始迁移:

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

如果没有引号,则在原始迁移中进行更改,然后通过以下方式再次运行向上迁移:

rake db:migrate

#2楼

如果该列已经填充了数据并且正在生产中,我建议采用一步一步的方法,以避免在等待迁移时停止生产。

首先,我创建一个db迁移来添加具有新名称的列,并使用旧列名中的值填充它们。

class AddCorrectColumnNames < ActiveRecord::Migrationdef upadd_column :table, :correct_name_column_one, :stringadd_column :table, :correct_name_column_two, :stringputs '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"endenddef downremove_column :table, :correct_name_column_oneremove_column :table, :correct_name_column_twoend
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::Migrationdef upremove_column :table, :old_name_column_oneremove_column :table, :old_name_column_twoenddef downadd_column :table, :old_name_column_one, :stringadd_column :table, :old_name_column_two, :stringend
end

然后将此最新迁移推送到生产并在后台运行bundle exec rake db:migrate

我意识到这一过程涉及到一个过程,但我宁愿这样做而不是生产迁移的问题。


#3楼

如果需要切换列名,则需要创建占位符以避免重复的列名错误 。 这是一个例子:

class SwitchColumns < ActiveRecord::Migrationdef changerename_column :column_name, :x, :holderrename_column :column_name, :y, :xrename_column :column_name, :holder, :yend
end

#4楼

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

Available Transformations

rename_column(table_name, column_name, new_column_name):

重命名列但保留类型和内容。


#5楼

rename_column :table, :old_column, :new_column

更新:

您可能希望创建单独的迁移来执行此操作。 (按照您的意愿重命名FixColumnName)

script/generate migration FixColumnName
# creates  db/migrate/xxxxxxxxxx_fix_column_name.rb

然后编辑迁移以执行您的意愿。

# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migrationdef self.uprename_column :table_name, :old_column, :new_columnenddef self.down# rename back if you need or do something else or do nothingend
end

Rails 3.1的更新

同时,在updown的方法仍然适用。 Rails 3.1接收一个change方法, “知道如何迁移数据库并在回滚迁移时将其反转,而无需编写单独的down方法”

rails g migration FixColumnNameclass FixColumnName < ActiveRecord::Migrationdef changerename_column :table_name, :old_column, :new_columnend
end

如果您碰巧有一大堆要重命名的列,或者需要一遍又一遍地重复表名的内容。

rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...

你可以使用change_table来保持一点整洁。

class FixColumnNames < ActiveRecord::Migrationdef changechange_table :table_name do |t|t.rename :old_column1, :new_column1t.rename :old_column2, :new_column2...endend
end

感谢Luke && Turadg提出这个话题。

然后只是db:migrate像往常一样db:migrate ,或者你继续开展业务。


Rails 4的更新

在创建Migration作为用于重命名的列,轨道4产生change的方法,而不是updown如在上面提到的答案。 生成的change方法如下:

$ > rails g migration ChangeColumnName

这将创建一个类似于此的迁移文件:

class ChangeColumnName < ActiveRecord::Migrationdef changerename_column :table_name, :old_column, :new_columnend
end

#6楼

IMO,在这种情况下,更好地使用rake db:rollback 。 然后编辑您的迁移并再次键入rake db:migrate 。 但是,如果列中有数据,则不想丢失,请使用rename_column


#7楼

如果您的代码没有与其他代码共享,那么最好的选择就是执行rake db:rollback然后在迁移中编辑您的列名并进行rake db:migrate 。 而已

您可以编写另一个迁移来重命名该列

 def changerename_column :table_name, :old_name, :new_nameend

而已。


#8楼

某些版本的Ruby on Rails支持向上/向下迁移方法,如果在迁移中有up / down方法,则:

def uprename_column :table_name, :column_old_name, :column_new_name
enddef downrename_column :table_name, :column_new_name, :column_old_name
end

如果迁移中有change方法,则:

def changerename_column :table_name, :column_old_name, :column_new_name
end

有关更多信息,您可以移动: Ruby on Rails - 迁移Active Record Migrations


#9楼

只需创建一个新的迁移,在一个块中,使用rename_column ,如下所示。

rename_column :your_table_name, :hased_password, :hashed_password

#10楼

我们可以手动使用以下方法:

我们可以手动编辑迁移,如:

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

  • hased_password更新为hashed_password

  • 运行以下命令

     $> rake db:migrate:down VERSION=xxxxxxxxx 

然后它将删除您的迁移:

$> rake db:migrate:up VERSION=xxxxxxxxx

它将使用更新的更改添加您的迁移。


#11楼

运行以下命令以创建迁移文件:

rails g migration ChangeHasedPasswordToHashedPassword

然后在db/migrate文件夹中生成的文件中,写入rename_column ,如下所示:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migrationdef changerename_column :table_name, :hased_password, :hashed_passwordend
end

#12楼

对于Ruby on Rails 4:

def changerename_column :table_name, :column_name_old, :column_name_new
end

#13楼

您有两种方法可以做到这一点:

  1. 在这种类型中,它在回滚时自动运行它的反向代码。

     def change rename_column :table_name, :old_column_name, :new_column_name end 
  2. 对于这种类型,它在rake db:migrate时运行up方法,并在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 

#14楼

打开Ruby on Rails控制台并输入:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column

#15楼

生成迁移文件:

rails g migration FixName

#创建db / migrate / xxxxxxxxxx.rb

编辑迁移以执行您的意愿。

class FixName < ActiveRecord::Migrationdef changerename_column :table_name, :old_column, :new_columnend
end

#16楼

生成Ruby on Rails迁移

$:> rails g migration Fixcolumnname

在迁移文件(XXXXXfixcolumnname.rb)中插入代码

class Fixcolumnname < ActiveRecord::Migrationdef changerename_column :table_name, :old_column, :new_columnend
end

#17楼

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

打开该迁移文件并按如下所示修改该文件(输入原始table_name

class  RenameHashedPasswordColumn < ActiveRecord::Migrationdef changerename_column :table_name, :hased_password, :hashed_passwordend
end

#18楼

更新 - create_table的近亲是change_table,用于更改现有表。 它以与create_table类似的方式使用,但产生块的对象知道更多技巧。 例如:

class ChangeBadColumnNames < ActiveRecord::Migrationdef changechange_table :your_table_name do |t|t.rename :old_column_name, :new_column_nameendend
end

如果我们使用其他alter方法,例如:remove / add index / remove index / add column,这种方式会更有效,例如我们可以做更多的事情:

# 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
#...

#19楼

运行rails g migration ChangesNameInUsers (或任何你想要命名的东西)

打开刚刚生成的迁移文件,并在方法中添加此行(在def changeend之间):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

保存文件,然后在控制台中运行rake db:migrate

查看schema.db ,以查看数据库中的名称是否已实际更改!

希望这可以帮助 :)


#20楼

 def changerename_column :table_name, :old_column_name, :new_column_nameend

#21楼

只需使用命令生成迁移

rails g migration rename_hased_password

在编辑之后,迁移在change方法中添加以下行

rename_column :table, :hased_password, :hashed_password

这应该可以解决问题。


#22楼

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 migration AddNameToStudent name:string


#23楼

来自API:

rename_column(table_name, column_name, new_column_name)

它重命名列,但保持类型和内容保持不变。


#24楼

我在rails 5.2上,并试图在设备用户上重命名一个列。

rename_column位对我rename_column ,但是单数:table_name抛出了“找不到用户表”错误。 多元为我工作。

rails g RenameAgentinUser

然后将迁移文件更改为:

rename_column :users, :agent?, :agent

哪里:代理? 是旧的列名。


#25楼

我们来吻吧 。 所需要的只是三个简单的步骤。 以下适用于Rails 5.2

1。 创建迁移

  • rails g migration RenameNameToFullNameInStudents

  • rails g RenameOldFieldToNewFieldInTableName - 这样,以后对代码库的维护者来说非常清楚。 (对表名使用复数形式)。

2.编辑迁移

# I prefer to explicitly write the向上and向下methods.

# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb

class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]def up# rename_column :table_name, :old_column, :new_columnrename_column :students, :name, :full_nameenddef down# Note that the columns are reversedrename_column :students, :full_name, :nameend
end

3.运行迁移

rake db:migrate

你要参加比赛了!


#26楼

作为一种替代选择,如果您没有与迁移的想法结合,那么ActiveRecord有一个引人注目的宝石,它将自动为您处理名称更改,Datamapper样式。 您所做的只是更改模型中的列名称(并确保将Model.auto_upgrade!放在model.rb的底部)和中提琴! 数据库即时更新。

https://github.com/DAddYE/mini_record

注意:您需要nuke db / schema.rb以防止冲突

仍然处于测试阶段,显然不适合所有人,但仍然是一个令人信服的选择(我目前在两个非平凡的生产应用程序中使用它没有问题)

如何在Ruby on Rails迁移中重命名数据库列?相关推荐

  1. 如何在Ruby on Rails中获得当前的绝对URL?

    如何在Ruby on Rails视图中获取当前的绝对URL ? request.request_uri仅返回相对URL. #1楼 url_for(params) 您可以轻松添加一些新参数: url_f ...

  2. iOS 在 Xcode 中重命名项目名称

    本教程使用的 Xcode 版本是Xcode 6.3.1,网上有好多的教程,都是在 Xcode 4 上做的讲解,现以本文章讲解一下如何在 Xcode 6.3.1 中重命名你的项目名称,包括你的应用名称. ...

  3. linux重命名乱码文件,Linux中重命名乱码文件

    Linux下,如何将一个乱码的文件进行重命名 方法一: 命令格式:mv $(ls |egrep "[^a-zA-Z0-9.-]") tandao.tx [root@nb o]# l ...

  4. sql重命名数据库_SQL重命名数据库

    sql重命名数据库 In the real world, there is very minimal chance when we need to rename database but still ...

  5. ruby on rails_如何在Ruby on Rails应用中用Vue.js替换jQuery

    ruby on rails by Igor Petrov 通过伊戈尔·彼得罗夫(Igor Petrov) 如何在Ruby on Rails应用中用Vue.js替换jQuery (How to repl ...

  6. linux中文件重命名_如何在Linux中重命名文件?

    linux中文件重命名 This tutorial will walk you through the simple steps to rename a file in Linux. 本教程将引导您完 ...

  7. sas rename重命名_如何使用sp_rename命令在SQL Server中重命名表

    sas rename重命名 In this article, we will learn to rename tables in SQL Server. sp_rename is a built-in ...

  8. sql server重命名_在Linux上SQL Server中重命名逻辑和物理文件名

    sql server重命名 Each database in SQL Server contains at least two files i.e. Data file (*.mdf) and log ...

  9. 在linux终端中重命名文件,Linux系统中重命名文件的方法有哪些

    今天小编要跟大家分享的文章是关于Linux系统中重命名文件的方法有哪些.正在从事Linux运维工作和学习Linux运维知识的小伙伴们来和小编一起看一看吧,希望本篇文章能够对大家有所帮助. 在Linux ...

最新文章

  1. python模块os测试文件是否存在及基础原信息获取
  2. putty network error:Connection refused 乱码
  3. 传统企业向产业互联网转型的两条路径
  4. mysql php 缓存机制_mysql数据库查询缓存原理是什么
  5. pip升级python版本_GEE学习笔记 六十八:【GEE之Python版教程二】配置Python开发环境...
  6. java通用对象_有效的Java –所有对象通用的方法
  7. Hamcrest匹配器常用方法总结
  8. bcscale php,【PHP开发】bcscale timezone charset的设定说明
  9. Go -- 调用C/C++
  10. 实验2-2-7 整数四则运算 (10 分)
  11. [渝粤教育] 西南科技大学 数据库应用 在线考试复习资料(5)
  12. C++序列式容器(STL序列式容器)
  13. [转载]宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)
  14. 职称计算机internet应用模块,全国职称计算机考试题库(Internet应用XP版模块)
  15. hdmi怎么支持2k分辨率_HDMI更新了!HDMI线用户忍受了一年的问题,终于能解决了...
  16. vs2015+opencv在xp下使用的问题
  17. crontab 两周执行一次 查看执行计划
  18. js 把数据生成word
  19. Python小游戏之王者荣耀
  20. Microbiome杂志和主编介绍,影响因子和版面费齐飞

热门文章

  1. PHP数组合并的常见问题
  2. myeclpse 8.5 小问题记录
  3. 2014届去哪儿校园招聘笔试题
  4. 12个有趣的C语言问答_sunyrising-ChinaUnix博客
  5. JDK1.8聚合操作
  6. 【原】小程序常见问题整理
  7. UVa 10020 (最小区间覆盖) Minimal coverage
  8. Android 浏览器启动应用程序
  9. C语言中的static
  10. 10种电脑无法启动故障