【问题标题】:Run migrations from rails console从 rails 控制台运行迁移
【发布时间】:2011-09-02 17:39:59
【问题描述】:

有没有办法在控制台上为 db:migrate 和 db:rollback 运行 rake 命令?

等待 rails 环境加载很糟糕!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1


    【解决方案1】:

    在控制台中:

    ActiveRecord::Migration.remove_column :table_name, :column_name
    

    要在从控制台运行迁移后更新您的 schema.rb 文件,您必须运行 rails db:migrate

    【讨论】:

    • @WestonGanger 怎么样?
    • @nruth 不确定韦斯顿在这里是否正确。我发现每当我运行这些命令时,我可能必须执行reload! 才能在控制台中获得效果,并且在完成控制台后,只要我退出控制台,我就会执行 rails db:migrate 和它迁移它们,并更新 db/schema.rb 。真的很好看 db/schema.rb 。它显示了您所有的表格。 rails db:migrate 为你更新 schema.rb,至少我认为这是我发现的。
    • @WestonGanger 愿意发表评论吗?(因为您的评论有问题)
    • @barlop @nruth。只要运行此命令并更改数据库,就会发生迁移,但不会更新架构。运行rails db:migrate 可以自动更新架构。但是,这是答案中没有的额外步骤。
    • @WestonGanger 是的,但是由于您可以执行 rails db:migrate,因此无需手动更新 schema.rb 文件。那会自动更新它。
    【解决方案2】:

    导轨

    这将允许您在不重新加载整个 rails 环境的情况下进行迁移:

    ActiveRecord::Migrator.migrate "db/migrate"
    

    和回滚:

    # 3 is the number of migration to rollback, optional, defaults to 1
    ActiveRecord::Migrator.rollback "db/migrate", 3
    

    Rails >= 5(感谢@gssbzn,他的答案如下)

    迁移:

    ActiveRecord::MigrationContext.new("db/migrate").migrate
    

    然后回滚:

    # 3 is the number of migration to rollback, optional, defaults to 1
    ActiveRecord::MigrationContext.new("db/migrate").rollback 3
    

    【讨论】:

    • 请注意,如果您使用的是 Mongoid,则相同:Mongoid::Migrator.migrate "db/migrate"
    • 这非常适合添加到 Rails 应用程序中的 test_helper.rb 中
    • 收到错误,bash: ActiveRecord::Migrator.migrate: command not found... 使用 Rails 2.3.18,ruby 1.9.3p551,现在在 rails 控制台内执行命令后执行。跨度>
    • 这对 Rails 4 是正确的,但不适用于以后的版本
    • 对于较新的Rails版本,还需要通过schema_migration:ActiveRecord::MigrationContext.new(ActiveRecord::Migrator.migrations_paths, ActiveRecord::Base.connection.schema_migration)
    【解决方案3】:

    我发现从控制台运行一些迁移命令更简洁的另一种方法是:

    ActiveRecord::Schema.define do
      create_table :foo do |t|
        t.string  :bar
        t.timestamps
      end
    end
    

    这样做的好处是块内的内容与从真实迁移文件/schema.rb中复制和粘贴随机内容兼容。

    【讨论】:

    • 我发现这对于诊断一些特定于数据库的迁移问题非常有帮助。谢谢!
    【解决方案4】:

    对于 rails 5.2,已接受的答案已被删除并替换为

    ActiveRecord::MigrationContext.new("db/migrate").migrate
    

    请注意,这也可能会随着 Rails 的未来版本而改变,因为它们会添加多个数据库连接

    【讨论】:

      【解决方案5】:

      对于 Rails 5 和 Rails 6:

      ActiveRecord::Base.connection.migration_context.migrate
      

      对于 Rails 3 和 Rails 4:

      ActiveRecord::Migrator.migrate 'db/migrate'
      

      【讨论】:

      • 这是 Rails 5 和 6 的最佳答案,因为它使用现有方法来获取迁移上下文(直接实例化它可能不可靠)。
      【解决方案6】:

      我需要假装已运行迁移以取消阻止部署,这可以通过以下方式完成:

      class Mig < ActiveRecord::Base; self.table_name = 'schema_migrations';end
      Mig.create! version: '20180611172637'
      

      【讨论】:

        【解决方案7】:

        你可以使用 %x[command]

        %x[rake db:migrate]
        

        【讨论】:

        • 这违背了不必等待导轨加载的目的。
        • @rafamvc 是的,同意!这就是为什么我认为 Benoit 的答案更好:)
        【解决方案8】:

        我在我的 .irbrc 文件中创建了一个运行迁移然后重新加载控制台的方法:

        def migrate
          if defined? Rails::Console # turn off info logging for Rails 3
            old_log_level = ActiveRecord::Base.logger.try(:sev_threshold)
            ActiveRecord::Base.logger.sev_threshold = Logger::WARN
          end
          reload! && migations_ran = true if ActiveRecord::Migrator.migrate(Rails.root.join("db/migrate")).any?
          ActiveRecord::Base.logger.sev_threshold = old_log_level if defined? old_log_level
          migations_ran ||= nil # useful exit status
        end
        

        在此处查看整个文件:https://gist.github.com/imme5150/6548368

        【讨论】:

          【解决方案9】:

          运行单一迁移

          ActiveRecord::Migration.add_column(:table_name, :column_name, :data_type)

          运行所有迁移

          ActiveRecord::Migrator.migrate('db/migrate')

          回滚 n 次迁移

          ActiveRecord::Migrator.rollback('db/migrate', n)

          【讨论】:

            猜你喜欢
            • 2018-09-25
            • 2020-04-07
            • 1970-01-01
            • 1970-01-01
            • 2018-12-28
            • 1970-01-01
            • 2014-05-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多