gpt4 book ai didi

ruby-on-rails - rake 分贝 :migrate doesn't detect new migration?

转载 作者:行者123 更新时间:2023-12-04 15:49:33 26 4
gpt4 key购买 nike

有 Rails/ActiveRecord 2.1.1 经验

  • 您使用(例如)ruby script\generate scaffold product title:string description:text image_url:string
  • 创建第一个版本
  • 这将创建(例如)一个名为 20080910122415_create_products.rb
  • 的迁移文件
  • 您使用 rake db:migrate
  • 应用迁移
  • 现在,您使用 ruby​​ script\generate migration add_price_to_product price:decimal
  • 在产品表中添加一个字段。
  • 这将创建一个名为 20080910125745_add_price_to_product.rb
  • 的迁移文件
  • 如果您尝试运行 rake db:migrate,它实际上会恢复第一次迁移,而不是应用下一次!所以你的产品表会被破坏!
  • 但是,如果您单独运行 rake,它会告诉您有一个迁移正在等待中

  • 请注意,应用 rake db:migrate (一旦表被销毁)将按顺序应用所有迁移。

    我发现的唯一解决方法是指定新迁移的版本,如下所示:
    rake db:migrate version=20080910125745

    所以我想知道:这是预期的新行为吗?

    最佳答案

    你应该可以使用

    rake db:migrate:up 

    迫使它继续前进,但是你可能会错过团队中其他人的交错迁移

    如果你跑
    rake db:migrate 

    两次,它将重新应用您的所有迁移。

    我在使用 SQLite 的 Windows 上遇到了相同的行为,这可能是特定于此类环境的错误。

    编辑 ——我找到了原因。在 railstie database.rake 任务中,您有以下代码:
    desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
    task :migrate => :environment do
    ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
    ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
    Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
    end

    然后在我的环境变量中我有
    echo %Version% #=> V3.5.0f

    在 ruby
    ENV["VERSION"] # => V3.5.0f
    ENV["VERSION"].to_i #=>0 not nil !

    因此 rake 任务调用
    ActiveRecord::Migrator.migrate("db/migrate/", 0)

    在 ActiveRecord::Migrator 中,我们有:
    class Migrator#:nodoc:
    class << self
    def migrate(migrations_path, target_version = nil)
    case
    when target_version.nil? then up(migrations_path, target_version)
    when current_version > target_version then down(migrations_path, target_version)
    else up(migrations_path, target_version)
    end
    end

    是的, rake db:migrate VERSION=0rake db:migrate:down 的长版本

    编辑 - 我会去更新灯塔错误,但我的 super 公司代理禁止我在那里连接

    同时,您可以在调用 migrate ... 之前尝试取消设置版本。

    关于ruby-on-rails - rake 分贝 :migrate doesn't detect new migration?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70318/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com