我错误地将列命名为hased_password而不是hashed_password。
hased_password
hashed_password
如何更新数据库架构,使用迁移重命名此列?
请参阅“活动记录迁移”留档中的“可用转换”部分。
rename_column(table_name, column_name, new_column_name):
重命名列,但保留类型和内容。
rename_column :table, :old_column, :new_column
您可能需要创建一个单独的迁移来执行此操作。(根据需要重命名FixColumnName。):
FixColumnName
bin/rails generate migration FixColumnName# creates db/migrate/xxxxxxxxxx_fix_column_name.rb
然后编辑迁移以执行您的意愿:
# db/migrate/xxxxxxxxxx_fix_column_name.rbclass FixColumnName < ActiveRecord::Migrationdef self.uprename_column :table_name, :old_column, :new_columnend def self.down# rename back if you need or do something else or do nothingendend
对于Rails 3.1使用:
虽然up和down方法仍然适用,但Rails 3.1收到了change方法,该方法“知道如何迁移数据库并在迁移回滚时反转它,而无需编写单独的down方法”。
up
down
change
有关更多信息,请参阅“活动记录迁移”。
rails g migration FixColumnName class FixColumnName < ActiveRecord::Migrationdef changerename_column :table_name, :old_column, :new_columnendend
如果你碰巧有一大堆列要重命名,或者需要一遍又一遍地重复表名:
rename_column :table_name, :old_column1, :new_column1rename_column :table_name, :old_column2, :new_column2...
你可以使用change_table来让事情变得更整洁:
change_table
class FixColumnNames < ActiveRecord::Migrationdef changechange_table :table_name do |t|t.rename :old_column1, :new_column1t.rename :old_column2, :new_column2...endendend
然后只是db:migrate像往常一样,或者无论你怎么做你的生意。
db:migrate
对于Rails 4:
在为重命名列创建Migration时,Rails 4会生成change方法,而不是上一节中提到的up和down。生成的change方法是:
Migration
$ > rails g migration ChangeColumnName
这将创建一个类似于以下内容的迁移文件:
class ChangeColumnName < ActiveRecord::Migrationdef changerename_column :table_name, :old_column, :new_columnendend
在我看来,在这种情况下,最好使用rake db:rollback,然后编辑您的迁移并再次运行rake db:migrate。
rake db:rollback
rake db:migrate
但是,如果您不想丢失列中的数据,请使用rename_column。
rename_column
从API:
rename_column(table_name, column_name, new_column_name)
这将重命名列,但类型和内容保持不变。
作为另一种选择,如果您没有与迁移的想法结婚,那么ActiveRecords有一个引人注目的宝石,它将自动为您处理名称更改,Datamapper风格。您所要做的就是更改模型中的列名,并确保将Model.auto_upgrade!放在model.rb的底部,并且Viola!数据库正在动态更新。
Model.auto_upgrade!
见https://github.com/DAddYE/mini_record
注意:您需要使用Nukedb/schema.rb来防止冲突。
db/schema.rb
它仍处于测试阶段,显然不适合所有人,但它仍然是一个引人注目的选择。我目前在两个不平凡的生产应用程序中使用它,没有任何问题。
如果当前数据对您不重要,您可以使用以下方法删除原始迁移:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
没有引号,然后在原始迁移中进行更改,并通过以下方式再次运行向上迁移:
如果该列已经填充了数据并在生产中运行,我建议采用循序渐进的方法,以避免在等待迁移时在生产中停机。
首先,我创建一个db迁移来添加具有新名称的列,并用旧列名中的值填充它们。
class AddCorrectColumnNames < ActiveRecord::Migrationdef upadd_column :table, :correct_name_column_one, :stringadd_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"endend def downremove_column :table, :correct_name_column_oneremove_column :table, :correct_name_column_twoendend
然后我将提交更改,并将更改推送到生产中。
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_twoend def downadd_column :table, :old_name_column_one, :stringadd_column :table, :old_name_column_two, :stringendend
然后将此最新迁移推送到生产环境并在后台运行bundle exec rake db:migrate。
bundle exec rake db:migrate
我意识到这是一个更复杂的过程,但我宁愿这样做,也不愿在我的生产迁移中遇到问题。
如果您需要切换列名,则需要创建占位符以避免“重复列名”错误。这是一个示例:
class SwitchColumns < ActiveRecord::Migrationdef changerename_column :column_name, :x, :holderrename_column :column_name, :y, :xrename_column :column_name, :holder, :yendend
如果您的代码没有与其他代码共享,那么最好的选择就是rake db:rollback然后在迁移和rake db:migrate中编辑您的列名。就是这样
您可以编写另一个迁移来重命名列
def changerename_column :table_name, :old_name, :new_nameend
就这样。
某些版本的Ruby on Rails支持up/down方法进行迁移,如果您在迁移中有up/down方法,则:
def uprename_column :table_name, :column_old_name, :column_new_nameend def downrename_column :table_name, :column_new_name, :column_old_nameend
如果您在迁移中有change方法,则:
def changerename_column :table_name, :column_old_name, :column_new_nameend
有关详细信息,请参阅:Ruby on Rails-迁移或活动记录迁移。
只需创建一个新的迁移,并在一个块中,使用rename_column如下。
rename_column :your_table_name, :hased_password, :hashed_password
手动我们可以使用以下方法:
我们可以像这样手动编辑迁移:
打开app/db/migrate/xxxxxxxxx_migration_file.rb
app/db/migrate/xxxxxxxxx_migration_file.rb
更新hased_password到hashed_password
运行下面的命令
$> rake db:migrate:down VERSION=xxxxxxxxx
Then it will remove your migration:
$> rake db:migrate:up VERSION=xxxxxxxxx
它将使用更新的更改添加您的迁移。
运行此命令以创建迁移文件:
rails g migration ChangeHasedPasswordToHashedPassword
然后在db/migrate文件夹中生成的文件中,将rename_column写入如下:
db/migrate
class ChangeOldColumnToNewColumn < ActiveRecord::Migrationdef changerename_column :table_name, :hased_password, :hashed_passwordendend
对于Ruby on Rails 4:
def changerename_column :table_name, :column_name_old, :column_name_newend
你有两种方法来做到这一点:
在这种类型中,当回滚时,它会自动运行它的反向代码。
def changerename_column :table_name, :old_column_name, :new_column_nameend
To this type, it runs the up method when rake db:migrate and runs the down method when rake db:rollback:
def self.uprename_column :table_name, :old_column_name, :new_column_nameend def self.downrename_column :table_name,:new_column_name,:old_column_nameend
打开您的Ruby on Rails控制台并输入:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
生成迁移文件:
rails g migration FixName
创建db/migrate/xxxxxxxxxx.rb。
db/migrate/xxxxxxxxxx.rb
编辑迁移以执行您的意愿:
class FixName < ActiveRecord::Migrationdef changerename_column :table_name, :old_column, :new_columnendend
生成Ruby on Rails迁移:
$:> rails g migration Fixcolumnname
在迁移文件中插入代码(XXXXXfixcolumnname.rb):
class Fixcolumnname < ActiveRecord::Migrationdef changerename_column :table_name, :old_column, :new_columnendend
$: rails g migration RenameHashedPasswordColumninvoke active_recordcreate db/migrate/20160323054656_rename_hashed_password_column.rb
打开该迁移文件并修改该文件,如下所示(请输入原始table_name)
table_name
class RenameHashedPasswordColumn < ActiveRecord::Migrationdef changerename_column :table_name, :hased_password, :hashed_passwordendend
create_table的近亲是change_table,用于更改现有表。它的使用方式与create_table相似,但屈服于块的对象知道更多技巧。例如:
create_table
class ChangeBadColumnNames < ActiveRecord::Migrationdef changechange_table :your_table_name do |t|t.rename :old_column_name, :new_column_nameendendend
如果我们将其与其他更改方法一起使用,例如:删除/添加索引/删除索引/添加列,这种方式会更有效。我们可以做以下事情:
重命名
t.rename :old_column_name, :new_column_name
添加列
t.string :new_column
删除列
t.remove :removing_column
索引列
t.index :indexing_column
运行rails g migration ChangesNameInUsers(或任何你想命名的)
rails g migration ChangesNameInUsers
打开刚刚生成的迁移文件,并在方法中添加这一行(在def change和end之间):
def change
end
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
保存文件,并在控制台中运行rake db:migrate
检查您的schema.db,以查看名称是否在数据库中实际更改!
schema.db
希望有帮助:)
只需使用以下命令生成迁移:
rails g migration rename_hased_password
之后编辑迁移并在change方法中添加以下行:
rename_column :table, :hased_password, :hashed_password
这应该会起作用。
Rails 5迁移更改
eg:
rails g模型学生student_name: string age: integer
如果您想将student_name列更改为姓名
注意:-如果你不运行rails db:迁移
您可以执行以下步骤
rails d模型学生student_name: string age: integer
这将删除生成的迁移文件,现在您可以更正您的列名
rails g模型学生名称:字符串年龄:整数
如果您已迁移(rails db:迁移),请使用以下选项更改列名
rails g迁移删除学生student_name: stringrails g迁移AddNameTo学生名称:字符串
rails g迁移删除学生student_name: string
rails g迁移AddNameTo学生名称:字符串
我在rails 5.2上,并试图在devise User上重命名一列。
rename_column位对我有效,但单数:table_name抛出“未找到用户表”错误。复数对我有效。
:table_name
rails g RenameAgentinUser
然后将迁移文件更改为:
rename_column :users, :agent?, :agent
其中:代理?是旧的列名。
让我们KISS。只需要三个简单的步骤。以下适用于Rails 5.2。
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName-这样以后代码库的维护人员就非常清楚了。(对表名使用复数)。
rails g RenameOldFieldToNewFieldInTableName
# I prefer to explicitly write theupanddownmethods.
# 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_nameend def down# Note that the columns are reversedrename_column :students, :full_name, :nameendend
你要去比赛了!
我在使用PostgreSQL数据库开发Rails 6应用程序时遇到了这个挑战。
这是我如何修复它:
在我的例子中,table_name是“产品”,old_column是“SKU”,new_column是“产品编号”。
old_column
new_column
创建一个迁移文件,其中包含重命名列的命令:
rails generate migration RenameSKUToProductNumberInProducts
在db/migrate directory中打开迁移文件:
db/migrate directory
db/migrate/20201028082344_rename_sku_to_product_number_in_products.rb
添加重命名列的命令:
class RenameSkuToProductNumberInProducts < ActiveRecord::Migration[6.0]def change# rename_column :table_name, :old_column, :new_columnrename_column :products, :sku, :product_numberendend
保存,然后运行迁移命令:
rails db:migrate
您现在可以通过查看架构文件来确认列的重命名:
如果您对列的重命名不满意,您可以随时回滚:
rails db:rollback
说明:努力在所有调用它的地方将列名修改为新名称。
您可以编写迁移运行以下命令来更新列名:
此外,请确保使用新列名更新代码中旧列名的任何用法。
rails g migration migrationName
因此,您转到生成的迁移并添加:
到方法
首先你得跑
rails g migration create_new_column_in_tablename new_column:datatyperails g migration remove_column_in_tablename old_column:datatype
然后您需要检查数据库/迁移您可以在nem迁移中检查详细信息,如果所有详细信息都正确,您需要运行:
在控制台:
rails generate migration newMigration
在新迁移文件中:
class FixColumnName < ActiveRecord::Migrationdef changerename_column :table_name, :old_column, :new_columnendend
可能比重命名列、创建新列并复制内容更好:
通过这种方式我们可以将内容保存在旧列中
这可能是一代人:
rails generate migration add_birthdate_to_User birthdate:string
这可能是迁移:
class AddBirthdateToUser < ActiveRecord::Migration[7.0]def changeadd_column :user, :birthdate, :json, default: '[]', null: false reversible do |dir|dir.up doUser.update_all('birthdate=birtdate') # rubocop:disable Rails/SkipsModelValidationsendendendend
之后,您必须删除错误的列“Birtdate”
class RemoveBirthdateFromUser < ActiveRecord::Migration[7.0]def changeremove_column :User, :Birtdate, :jsonendend