我运行了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
有什么建议吗?
答案 0 :(得分:3)
如果您正在使用FactoryBot(FactoryGirl)并且您的工厂包含任何模型类型引用,请确保它们用大括号括起来。这可以防止db:schema:load
爆炸,你不必将你的工厂评论出来。
例如,假设您有一个带轮子和引擎的Car模型,您的种子数据中有两种类型的引擎,并且使用特征来指定引擎类型。
此代码会炸毁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
答案 1 :(得分:2)
我不完全理解为什么,但是 rake db:schema:load 我的FactoryGirl文件出了问题。我暂时删除了文件, rake db:schema:load 工作正常。
问题是由错误定义的FactoryGirl关联引起的。仍然不确定为什么工厂女孩在rake db:schema:load。
期间初始化答案 2 :(得分:1)
我经常面临同样的问题。您有没有在之前手动管理数据库?我的意思是,假设你已经完成了创建迁移等等,然后你手动删除表。请检查您的迁移文件,它们之间会以某种方式重叠。
尝试找到构成此堆栈的迁移文件。如果需要,尝试编辑,甚至删除。
如果我错了,请纠正我。
答案 3 :(得分:1)
我在继承的项目中遇到了这个问题。它与从数据库加载模型的路由约束有关,例如
constraints(foobar: /#{FooBar.pluck(:name).join('|')}|other/) do
为了快速入门,我只是对块进行了评论,运行rake
任务然后取消注释块,一切都是黄金的。显然不是原始问题的问题,而是由于加载问题导致相同错误的修复,但问题略有不同。