【问题标题】:how to change the position of a new column in rails 3.x migration如何在 rails 3.x 迁移中更改新列的位置
【发布时间】:2012-01-28 15:29:18
【问题描述】:

我创建了一个迁移,它只是添加了一个新列,但我希望它在 created_at 和 updated_at 列之前添加,有没有办法指定新列的创建位置?

我搜索了一下,只发现有人说要在 add_column 中使用 :after 选项,但它什么也没做。然后我查看了 rails api 文档,发现没有这样的选项。

【问题讨论】:

  • 为什么重要?我对 :after 选项一无所知,但如果您仍在开发中并且您没有丢失存储在表中的数据的问题,您可以随时删除该表,并使用所有属性,无需迁移即可添加某些列。
  • 只是出于好奇:除了表格的视觉可读性之外,这对 smth 有什么影响吗?
  • 我希望它具有更好的表格视觉可读性,但在寻找解决方案时,我发现了一些关于性能影响的博客文章
  • @GalBen-Haim,你能分享博客文章的链接吗?

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

After 选项对我很有效

add_column :table_name, :column_name, :type, :after => :column_name

也请看this question

【讨论】:

  • 我尝试了 :after 选项,在 db/schema.rb 和 sqlitebrowser 中我都没有发现任何区别。 (当然在重置数据库并运行迁移之后)我的开发环境是 rails 3.2.1 和 sqlite
  • 看起来是这样,你在使用 Postgres 吗?在迁移中尝试原始 SQL
  • 我正在使用 sqlite 进行开发,生产可能是 heroku 上的 postgres
  • 只是为了确认,是的,:after 选项仅适用于 MySQL 数据库。由于某种原因,Postgres 适配器从未更新以支持此功能(从 Rails 3.2.13 开始)
  • 这不是Rail的遗漏,PG不允许这样:dba.stackexchange.com/a/3277
【解决方案2】:

根据我的研究,:after 选项不适用于 SQLitePostgres,因为这些 DBMS 不允许此类操作。但是,该选项适用于 MySQL

参考资料:

  1. SQLite: https://www.sqlite.org/lang_altertable.html - 这基本上 告诉您创建一个具有正确列顺序的新表,然后 复制数据。

  2. Postgres:https://wiki.postgresql.org/wiki/Alter_column_position

【讨论】:

    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多