5

我运行 rake db:drop (成功)并运行 rake db:create (成功)但是 rake db:schema:load 抛出了一个我无法弄清楚的奇怪错误。

** Invoke db:schema:load (first_time)
** Invoke environment (first_time)
** Execute environment
rake aborted! PG::UndefinedTable: ERROR:  relation "admins" does not exist
LINE 5: WHERE a.attrelid = '"admins"'::regclass
                                      ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                    pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
               FROM pg_attribute a LEFT JOIN pg_attrdef d
                 ON a.attrelid = d.adrelid AND a.attnum = d.adnum
           WHERE a.attrelid = '"admins"'::regclass
                AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum

有什么建议么?

4

4 回答 4

7

如果您使用的是 FactoryBot (FactoryGirl),并且您的工厂包含任何模型类型引用,请确保将它们括在花括号中。这样可以防止db:schema:load爆炸,您不必注释掉您的工厂。

例如,假设您有一个带有轮子和引擎的汽车模型,并且您的种子数据中有两种类型的引擎,并且正在使用特征来指定引擎类型。

这段代码会爆炸db:schema:load

FactoryBot.define do
  factory :car do
    wheels

    trait(:v8) {
      engine Engine.find_by_type('V8') 
    }

    trait(:i4) {
      engine Engine.find_by_type('I4') 
    }
  end
end

这将防止db:schema:load爆炸:

FactoryBot.define do
  factory :car do
    wheels

    trait(:v8) {
      engine { Engine.find_by_type('V8') }
    }

    trait(:i4) {
      engine { Engine.find_by_type('I4') }
    }
  end
end

这是关于它的讨论:https ://github.com/thoughtbot/factory_bot_rails/issues/134

更新:在为工厂指定类时也会发生这种情况:

这段代码会爆炸db:schema:load

FactoryBot.define do
  factory :hot_rod, class: Car do

这将防止db:schema:load爆炸(使用符号而不是模型类型):

FactoryBot.define do
  factory :hot_rod, class: :car do
于 2018-01-09T19:22:43.560 回答
2

我不完全明白为什么,但是rake db:schema:load我的 FactoryGirl 文件之一出现问题。我暂时删除了文件并rake db:schema:load工作正常。

该问题是由错误定义的 FactoryGirl 关联引起的。仍然不确定为什么工厂女孩在 rake db:schema:load 期间初始化。

于 2013-11-09T18:52:21.757 回答
2

在我继承的一个项目中,我遇到了这个问题。这与从数据库加载模型的路由约束有关,例如

constraints(foobar: /#{FooBar.pluck(:name).join('|')}|other/) do

为了快速开始,我只是评论了这个块,运行了rake任务然后取消了这个块的注释,一切都是金色的。显然不是原始问题的问题,而是由于加载问题而修复了相同错误但问题略有不同的问题。

于 2016-12-22T00:19:17.087 回答
1

我经常面临同样的问题。您以前曾经手动管理数据库吗?我的意思是,假设到目前为止您已经完成了创建迁移等操作,然后您手动删除了表。请检查您的迁移文件,它以某种方式相互重叠。

尝试找到构成此堆栈的迁移文件。并尝试对其进行编辑,甚至在需要时将其删除。

如果我错了,请纠正我。

于 2013-11-09T04:27:10.907 回答