无法运行所有迁移文件。还能做什么?

时间:2017-11-02 16:13:46

标签: mysql ruby-on-rails

我有大量需要运行的迁移文件,其中一些显然已经过时了。例如:

这失败了:

  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      ...

出现此错误:

-- create_table(:users)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

undefined method `database_authenticatable' for #<ActiveRecord::ConnectionAdapters::TableDefinition

我认为因为Devise在撰写本文时已更新。

我还能做什么?

事实证明,这是一个模式文件。这是其中的一部分:

ActiveRecord::Schema.define(version: 20160221211458) do

  create_table "activities", force: true do |t|
    t.integer  "user_id",                  null: false
    t.string   "target_type", default: "", null: false
    t.integer  "target_id",                null: false
    t.string   "action",      default: "", null: false
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "activities", ["target_id"], name: "index_activities_on_target_id_and_target_type", using: :btree
  add_index "activities", ["user_id"], name: "index_activities_on_user_id", using: :btree

  create_table "addresses", force: true do |t|
  ...

执行bundle exec rake db:schema:load与尝试运行迁移之间的区别是什么。两者之间有区别吗?

此外,该数据库是一个mysql数据库:

# SQLite version 3.x
#   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
  adapter: mysql2
  database: arthouse_development
  username: root
  password:
  host: localhost
  port: 3306
  #socket: /tmp/mysql.sock

运行bundle exec rake db:schema:load

后如何查看此数据库

2 个答案:

答案 0 :(得分:1)

  

这失败了:

def self.up
 create_table(:users) do |t|
 t.database_authenticatable :null => false
  

我认为因为Devise在撰写本文时已更新。

我需要知道您收到的错误消息

  

结果是模式文件:

在您的架构中,我看到您没有users表,我认为您need to check your db mysql2并且看看您是否有某些内容。

  

执行bundle exec rake db:schema:load与尝试运行迁移之间的区别是什么?两者之间有区别吗?

让我们说我分叉了一个github项目,并且已经填充了schema文件。使用该命令,我加载了模式,因此我不会运行每次迁移,只需像模式一样创建表。

迁移使用脚本填充数据库,此脚本具有add_column之类的功能,可以修改schema.rb文件。

来自ActiveRecord:Migrations的每个函数都将修改架构,这意味着可能会添加一列并稍后删除。迁移中的这种冲突是由于此迁移不兼容造成的,例如,您添加了一个列,然后需要将其反转,但稍后您要向该列添加索引,因此迁移失败。有关以下link

的更多信息
  

迁移是一种以一致且简单的方式随时间改变数据库模式的便捷方式。他们使用Ruby DSL,因此您不必手动编写SQL,从而允许您的架构和更改独立于数据库。

     

您可以将每次迁移视为一个新的版本&#39;的数据库。架构一开始就没有任何内容,每次迁移都会修改它以添加或删除表,列或条目。 Active Record知道如何在此时间轴上更新您的架构,从历史记录中的任何位置到最新版本。 Active Record还将更新db / schema.rb文件以匹配数据库的最新结构。

解决方案

您的错误

rake aborted!
StandardError: An error has occurred, all later migrations canceled:

undefined method `database_authenticatable' for #<ActiveRecord::ConnectionAdapters::TableDefinition

鉴于您的问题,您应该找到解决方案

undefined method `database_authenticatable' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x9dee690>

答案 1 :(得分:1)

当我尝试部署到新的登台服务器时,我也在现有应用上遇到了这个问题。

结果是Devise gem已经更新到2.1并且我没有修复迁移以使用新版本正常工作。

请务必阅读他们在wiki上迁移到2.1 doc的文档 - https://github.com/plataformatec/devise/wiki/How-To:-Upgrade-to-Devise-2.1

另外,请务必仔细阅读文档,了解如何正确调整现有迁移 - https://github.com/plataformatec/devise/wiki/How-To:-Upgrade-to-Devise-2.0-migration-schema-style