Rails 迁移不会更改 schema.rb

Posted

技术标签:

【中文标题】Rails 迁移不会更改 schema.rb【英文标题】:Rails migration does not change schema.rb 【发布时间】:2013-12-26 05:25:20 【问题描述】:

我有一个未应用于我的 schema.rb 的 rails 迁移。迁移应该创建一个表:

class CreateUserGraphs < ActiveRecord::Migration
  def change
    create_table :user_graphs do |t|
      t.string :name
      t.string :content
      t.integer :user_id
      t.string :type_id
      t.integer :upload_id

      t.timestamps
    end

    add_index :user_graphs, [:user_id, :created_at]
  end
end

我做了 db:reset。然后我尝试了 rake db:migrate:up VERSION=123123123(这是迁移#)。我在我的“开发”环境中。

为什么迁移不影响 schema.rb?

【问题讨论】:

您是否尝试先删除数据库? rake db:drop db:create db:migrate 有趣的工作。 rake db:drop db:createrake db:reset 有何不同? rake db:reset 在没有迁移的情况下运行 db:create db:schema:load db:seed。我认为db:migrate:reset 会满足您的需求。 @Vucko,请将此建议添加为问题的有效答案;) 【参考方案1】:

来自documentation:

rake db:reset 任务将删除数据库,重新创建它并将当前架构加载到其中。

这与运行所有迁移不同。它只会使用 当前 schema.rb 文件的内容。如果迁移无法回滚, 'rake db:reset' 可能对你没有帮助。要了解有关转储架构的更多信息,请参阅 '模式倾销和你。'

所以rake db:reset => db:drop db:create db:schema:load db:seed

要运行所有迁移,请使用: rake db:drop db:create db:migrate

或者 db:migrate:reset=> rake db:drop db:create db:migrate

Reference

【讨论】:

【参考方案2】:

我遇到了同样的问题。我在开发环境中工作(使用Passenger 和Apache)。生产和开发环境使用相同的数据库。

当我运行rake db:migrate 时,数据库已更改,但架构未更新。然后我运行rake db:migrate RAILS_ENV=development,现在模式已更新。

似乎 rails/rake 对我的环境感到困惑。乘客为此站点设置了一个开发环境,但rake about说“环境生产”。

【讨论】:

【参考方案3】:

迁移的“版本”是通过时间戳完成的。 Rails 通过比较上次运行迁移的时间戳并查看是否有更新来检查需要运行哪些迁移。

如果您的新迁移版本是 123123123,它将不会运行,因为该数字不大于当前时间戳(例如 20131209170300)。

【讨论】:

【参考方案4】:

我遇到了同样的问题...原来是因为我编辑了迁移文件的名称以使其看起来更整洁。确保不要像我一样删除迁移文件标题中的时间戳。

我删除了迁移文件、模型、控制器和相关测试,并重新生成了解决问题的控制器和模型。

【讨论】:

【参考方案5】:

首先你尝试向下迁移

rake db:migrate:down VERSION=20180605141404 # "VERSION=20180605141404 您的迁移版本"

再次进行迁移

rake db:migrate:up VERSION=20180605141404 #"VERSION=20180605141404 您的迁移版本"

【讨论】:

【参考方案6】:

找到了一种获取错误描述的方法。 运行 rake db:migrate:reset 并收到

`SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "rooms" ADD "priority" integer NOT NULL/usr/local/rvm/gems/ruby-2.2.1/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:91:in `initialize`'

【讨论】:

以上是关于Rails 迁移不会更改 schema.rb的主要内容,如果未能解决你的问题,请参考以下文章

rails 迁移更改了不相关的列

Rails 迁移:self.up 和 self.down 与更改

Rails 迁移总是在模式中插入空格或更改列的顺序

如何从现有迁移文件中删除脚本 rails

Model.reset_column_information不会在rails迁移中重新加载列

Java/Groovy Rails 数据库迁移 [重复]