Rails 编辑迁移文件以包含索引?

Rails edit migration file to include index?

我一直在尝试找出一些方法来优化我的 MySQL 数据库,但我在此处编制索引时遇到了一些问题。

与堆积一堆迁移文件相反(因为我还没有真正管理很多数据),我只是 "going back" 并定期编辑迁移文件以包含列等。不确定如果这是最佳实践,但我认为避免以 100 个迁移文件添加小东西会更容易。

无论如何,我正在尝试将索引添加到迁移文件中的其中一个列,但我似乎无法让它工作(回滚和迁移后它没有出现在模式文件中)再次)。

class CreateVuln < ActiveRecord::Migration
  def change
    create_table :vuln do |t|
      t.integer :node_id
      t.string :node_identifier
      t.string :vuln_finding_identifier

      t.timestamps null: false
    end

    add_index :vuln, :node_identifier
  end
end

但是当我去 schema.rb 时,它是这样的:

  create_table "vuln", force: :cascade do |t|
    t.integer  "node_id",                 limit: 4
    t.string   "node_identifier",         limit: 255
    t.string   "vuln_finding_identifier", limit: 255
    t.datetime "created_at",                               null: false
    t.datetime "updated_at",                               null: false
  end

有人可以告诉我我在这里缺少什么吗?如果我通过 运行 rails g migration AddIndexToVuln node_identifier:string:index 添加新迁移,那么我可以看到 schema.rb 文件已正确更新。 schema.rb 然后添加这一行: add_index "vuln", ["node_identifier"], name: "index_vuln_on_node_identifier", using: :btree

因此,与创建新的迁移文件相反,我只是想知道我是否可以回滚我的数据库并在现有的迁移文件中为 table 进行更改。

我没有发现您的迁移有任何问题,因此首先要检查的是 rake db:rollback 是否真正成功。如果您 运行 在 添加 add_index 行之后回滚 那么回滚应该会失败,因为 Rails 将尝试 remove_index -存在的索引。如果回滚失败,修复很简单。注释掉 add_index 行和 运行 rake db:rollback,取消注释该行,然后 运行 rake db:migrate.

如果您处于开发的早期阶段并且真的不关心数据,您可以 运行 rake db:reset 这将删除数据库并从第一次迁移开始重建。

综上所述,创建新的迁移(无论多小)来修改架构绝对没有错 - 这是它们的预期目的。迟早你会遇到回滚和修改迁移无法扩展的地步,所以从一开始就接受这种方法。

首先了解您的迁移情况很重要。

因此,Rails 使用时间戳来跟踪迁移中的更改,因此当您 运行 rake db:migrate 时,Rails 将首先查看 schema.rb 检查您的数据库的当前状态。您会在架构文件中看到这种行:ActiveRecord::Schema.define(version: 20160625234411) do,所有迁移都以这种方式通过时间戳进行版本控制。

因此,它只会 运行 任何新迁移,即其时间戳大于架构文件上的时间戳。

所以,如果您想更改数据库的状态,这就是您实际上应该生成新迁移的原因,否则,您每次都必须继续执行 rake db:[drop|reset] 等操作才能正常工作。