【问题标题】:Rails 4 migration: how to reorder columnsRails 4 迁移:如何重新排序列
【发布时间】:2013-09-24 19:02:44
【问题描述】:

我了解到add_column 有一个:after 选项来设置列的插入位置。太糟糕了,我知道了:添加一堆之后。

如何编写迁移以简单地重新排序列?

【问题讨论】:

  • 您可以转储数据库以保存数据;重新排序您的 Schema.rb 以将时间戳列放在 create_table 块的末尾;运行rake db:drop db:create db:migrate,然后重新导入您的数据
  • 现在,这是一个未记录的功能:You have to read core sources 找到它。仅供参考,我检查了 rename_column 代码:它不提供此功能(对不起,它没有帮助)。
  • 在迁移中使用 SQL。 stackoverflow.com/questions/4095481/…
  • @Zabba 这不是一个坏主意。您能否将其作为答案提交,最好使用一些代码来显示在迁移中执行原始 MySQL 的语法。
  • 我刚刚指出了关于 SO 的另一个答案,但 Stefan 展示了一种无需 SQL 的好方法。

标签: ruby-on-rails ruby migration ruby-on-rails-4


【解决方案1】:

使用 MySQL 时,可以调用 change_column,但必须重复列类型(只需从其他迁移中复制并粘贴即可):

def up
  change_column :your_table, :some_column, :integer, after: :other_column
end

或者,如果您必须对一个表中的多个列重新排序:

def up
  change_table :your_table do |t|
    t.change :some_column, :integer, after: :other_column
    # ...
  end
end

change_column 在后台调用ALTER TABLE。来自MySQLdocumentation

您还可以在CHANGEMODIFY 操作中使用FIRSTAFTER 重新排序表中的列。

请注意,这种方法不适用于 PostgreSQL。 (见Alter column positions

【讨论】:

  • 好收获。我不知道它可以通过 ALTER TABLE 来实现。
  • @OlivierElMekki 我添加了指向 MySQL 文档的链接
  • @Stefan 我可以用def change代替updown吗?
  • @Emerson Rails 目前无法反转 change_column。你真的需要恢复列顺序吗?
  • 这些都不适用于 postgres - 无法重新排序列 stackoverflow.com/a/31683264/165673
猜你喜欢
  • 2021-03-20
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多