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]
等操作才能正常工作。
我一直在尝试找出一些方法来优化我的 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]
等操作才能正常工作。