如何在Ruby on Rails迁移中重命名数据库列?
我错误地将列命名为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的更新
同时,在up
和down
的方法仍然适用。 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
的方法,而不是up
和down
如在上面提到的答案。 生成的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楼
您有两种方法可以做到这一点:
在这种类型中,它在回滚时自动运行它的反向代码。
def change rename_column :table_name, :old_column_name, :new_column_name end
对于这种类型,它在
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 change
和end
之间):
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迁移中重命名数据库列?相关推荐
- 如何在Ruby on Rails中获得当前的绝对URL?
如何在Ruby on Rails视图中获取当前的绝对URL ? request.request_uri仅返回相对URL. #1楼 url_for(params) 您可以轻松添加一些新参数: url_f ...
- iOS 在 Xcode 中重命名项目名称
本教程使用的 Xcode 版本是Xcode 6.3.1,网上有好多的教程,都是在 Xcode 4 上做的讲解,现以本文章讲解一下如何在 Xcode 6.3.1 中重命名你的项目名称,包括你的应用名称. ...
- linux重命名乱码文件,Linux中重命名乱码文件
Linux下,如何将一个乱码的文件进行重命名 方法一: 命令格式:mv $(ls |egrep "[^a-zA-Z0-9.-]") tandao.tx [root@nb o]# l ...
- sql重命名数据库_SQL重命名数据库
sql重命名数据库 In the real world, there is very minimal chance when we need to rename database but still ...
- 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 ...
- linux中文件重命名_如何在Linux中重命名文件?
linux中文件重命名 This tutorial will walk you through the simple steps to rename a file in Linux. 本教程将引导您完 ...
- 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 ...
- sql server重命名_在Linux上SQL Server中重命名逻辑和物理文件名
sql server重命名 Each database in SQL Server contains at least two files i.e. Data file (*.mdf) and log ...
- 在linux终端中重命名文件,Linux系统中重命名文件的方法有哪些
今天小编要跟大家分享的文章是关于Linux系统中重命名文件的方法有哪些.正在从事Linux运维工作和学习Linux运维知识的小伙伴们来和小编一起看一看吧,希望本篇文章能够对大家有所帮助. 在Linux ...
最新文章
- python模块os测试文件是否存在及基础原信息获取
- putty network error:Connection refused 乱码
- 传统企业向产业互联网转型的两条路径
- mysql php 缓存机制_mysql数据库查询缓存原理是什么
- pip升级python版本_GEE学习笔记 六十八:【GEE之Python版教程二】配置Python开发环境...
- java通用对象_有效的Java –所有对象通用的方法
- Hamcrest匹配器常用方法总结
- bcscale php,【PHP开发】bcscale timezone charset的设定说明
- Go -- 调用C/C++
- 实验2-2-7 整数四则运算 (10 分)
- [渝粤教育] 西南科技大学 数据库应用 在线考试复习资料(5)
- C++序列式容器(STL序列式容器)
- [转载]宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)
- 职称计算机internet应用模块,全国职称计算机考试题库(Internet应用XP版模块)
- hdmi怎么支持2k分辨率_HDMI更新了!HDMI线用户忍受了一年的问题,终于能解决了...
- vs2015+opencv在xp下使用的问题
- crontab 两周执行一次 查看执行计划
- js 把数据生成word
- Python小游戏之王者荣耀
- Microbiome杂志和主编介绍,影响因子和版面费齐飞