PG 未定义错误关系用户不存在



我以前见过这个问题,但仅适用于 rspec。我还没有创建测试,因为它对我来说太先进了,但很快有一天我会!:P

当我尝试注册/登录我的应用程序时,我收到此错误。我使用设计来创建用户,并使用omniauth2登录谷歌

这是错误

ActiveRecord::StatementInvalid at /users/auth/google_oauth2/callback
PG::UndefinedTable: ERROR:  relation "users" does not exist
LINE 5:              WHERE a.attrelid = '"users"'::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 = '"users"'::regclass
               AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum

我尝试了rake db:migrate,但它已经创建:在架构表中存在用户。以前有人遇到过此错误吗?

数据库.yml

config=/opt/local/lib/postgresql84/bin/pg_config

development:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_development
  pool: 5
  username: my_username
  password:
test:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_test
  pool: 5
  username: my_username
  password:
production:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_production
  pool: 5
  username: my_username
  password:

首先,应将所有连接从数据库中分离出来。默认情况下,您使用开发环境。然后尝试使用以下方法重置数据库:

rake db:reset

rake db:reset 任务将删除数据库并重新设置它。这在功能上等同于rake db:drop db:setup。

这与运行所有迁移不同。它只会使用 当前架构.rb 文件的内容。如果迁移无法回滚, 耙子DB:重置可能对你没有帮助。要了解有关转储架构的更多信息,请参阅 架构转储和 U 部分。轨道文档

如果技巧没有帮助,请删除数据库,然后再次重新创建它,迁移数据,如果您有种子,请播种数据库:

rake db:drop db:create db:migrate db:seed

或简而言之(自 3.2 起(:

rake db:migrate:reset db:seed

由于db:migrate:reset意味着删除,因此请创建并迁移数据库。由于rake的默认环境是开发,因此如果您在规范测试中看到异常,则应为测试环境重新创建数据库,如下所示:

RAILS_ENV=test rake db:drop db:create db:migrate

或者仅加载迁移的方案:

RAILS_ENV=test rake db:drop db:create db:schema:load

在大多数情况下,测试数据库是在测试过程中播种的,因此不需要传递db:seed任务操作。否则,您应该准备数据库(这在 Rails 4 中已弃用(:

rake db:test:prepare

然后(如果实际需要(:

RAILS_ENV=test rake db:seed

在较新版本的 Rails 上,可能会引发错误 ActiveRecord::NoEnvironmentInSchemaError,因此只需在任务前面加上数据库环境集任务:db:environment:set

RAILS_ENV=test rake db:environment:set db:drop db:create db:migrate

遇到了这个错误,经过我的研究,发现PG未定义错误关系用户不存在错误的原因之一是:

此错误是迁移错误。您可能已经创建了具有某些数据库属性的新模型。创建模型后,您必须将属性迁移到 rails 应用程序架构。

如果您使用的是本地机器,则进行开发,可以使用命令

rake db:migrate

如果您使用的是 heroku

heroku run rake db:migrate

您的测试数据库尚未准备好使用 rspec。

为 rspec 准备测试数据库以修复此错误

RAILS_ENV=test rake test:prepare

它将删除、创建迁移并将其添加到测试数据库

如果 rake 任务中止并显示类似"PG::错误:错误:其他用户正在访问数据库"[your_db_test]"的消息,请执行此任务

RAILS_ENV=test rake db:migrate
我在

运行 rspec 时也遇到了此错误:

 Failure/Error: it { expect(subject.priority_list).to eq [nil] * 9 }
 ActiveRecord::StatementInvalid:
   PG::UndefinedTable: ERROR:  relation "priorities" does not exist
   LINE 5:              WHERE a.attrelid = '"priorities"'::regclass
 ...

我跑完后就为我解决了

rake db:test:prepare
rake db:test:load

我遇到了类似的错误。我的错误的根源是我的 factories.rb 文件中引用了 Rails 模型。所以它导致了加载错误问题。解决方法是将引用包装在块或{}中,以便延迟运行它。

这是破碎的代码:

FactoryGirl.define do
  factory :user do
    guid User.new.send(:new_token)
  end
end

这是错误的,因为加载 factory.rb 时没有定义User。我将User.new调用包装在一个块中,它解决了问题:

固定代码:

FactoryGirl.define do
  factory :user do
    guid { User.new.send(:new_token) }
  end
end

注意:可能不是需要像这样调用模型的最佳实践,但这是耗尽我的代码的解决方案。

这通常是由 ActiveAdmin 中的错误引起的。以下是解决该错误的方法:

如果您使用的是 ActiveAdmin,无论 PG 说哪个表不存在,请注释掉该 ActiveAdmin rb 文件的内容。

例如,对于这种情况PGError: ERROR: relation "users" does not exist,注释掉app/admin/users.rb的全部内容,然后在完成迁移后取消注释。

对我来说

,这个问题是由工厂女孩轨道引起的。我建议那些使用它的人将规格/工厂文件夹重命名为规格/临时并尝试

RAILS_ENV=your_environment 捆绑执行 耙 DB:迁移 --跟踪

如果它通过了,那么你就找到了导致它的原因。快速挖掘工厂女孩轨道 gem github 存储库帮助我确定了问题所在。

工厂失败了,因为我试图实例化一个运行时不存在的模型!代码示例如下:

FactoryGirl.define do
  factory :billing_product, class: 'Billing::Product' do
    name            Faker::Cat.name
    product_type    'fuel'
    active          true
    payment_options [Billing::PaymentOption.new(term: 1, payment_term: 1)]
  end
end

将数组封装在一个块中(添加 {}(为我修复了问题。请注意,payment_options可以在示例中采用多个付款方式...

payment_options {[Billing::PaymentOption.new(term: 1, payment_term: 1)]}

有关详细信息,请参阅工厂女孩轨道文档的动态属性部分。

不要忘记重命名您的工厂文件夹!

我遇到了同样的问题,然后我发现了以下解决方案。

确保您已在 database.yml 文件中输入了以下所有凭据,并且这些凭据正确无误:

development:
 adapter: postgresql
 encoding: unicode
 database: my_database
 host: localhost
 port: 5432
 pool: 5
 username: postgres
 password: xyz
test:
 adapter: postgresql
 encoding: unicode
 database: my_test_database
 host: localhost
 port: 5432
 pool: 5
 username: postgres
 password: xyz 
<</div> div class="one_answers">

删除用户表后,我遇到了这个问题。 解决方案正在发生变化

change_table(:users)

create_table(:users)
迁移

中缺少::Migration[5.0]。而不是抛出语法错误,而是抛出

PG::

未定义表:错误:关系角色不存在

浪费了几个小时后,我终于发现迁移缺少::Migration[5.0].

错误迁移:

class CreateRoles < ActiveRecord # <---- Pay attention
  def change
    create_table :roles do |t|
      t.string :name
      t.integer :code, limit: 2
      t.boolean :is_active, default: true
      t.timestamps
    end
  end
end

修复和正确的迁移

class CreateRoles < ActiveRecord::Migration[5.0]
  def change
    create_table :roles do |t|
      t.string :name
      t.integer :code, limit: 2
      t.boolean :is_active, default: true
      t.timestamps
    end
  end
end

这可能是一个轨道的错误,可能会帮助某人,而不是挣扎和想知道。

最可能的原因是您的耙子使用与 database.yml 不同的环境与您的 Web 服务器不同。

我在

尝试使用 rspec 运行测试时遇到了类似的错误。

我跟着Малъ Скрылевъ的脚步,但最终还是失败了。我需要做的最后一步是使用以下方法将我的架构加载到我的测试数据库中:

RAILS_ENV=test rake db:schema:load

之后问题消失了,我可以继续下一个错误。希望这能给你一些见解。

删除管理员文件夹并再次运行 rake。

(我知道这很老,但对于未来的谷歌用户(

你用devise吗?我特别知道omniauthable是一个问题,但也许还有其他问题。不过,它不必devise。一般来说,解决方案是注释掉有问题的模型、类等,并取消注释错误要求的任何部分。

对我来说,发生的事情是devise正在读取User模型以查看您拥有的参数devise(类方法(即 devise :database_authenticatable, :registerable #etc (

但是,它将读取整个文件,如果这不是一个新项目,它可能会被依赖其他东西的其他类方法绊倒(在我的例子中,它是friendly_id的宝石,然后是一个alias_method

答案是注释掉User模型,除了devise行*,rake db:schema:load应该运行良好。

  • 否则我收到此错误:

    参数错误:在非全能身份验证的资源上映射omniauth_callbacks请向User模型添加devise :omniauthable

如果在迁移时收到此错误,请确保模型名称为复数

形式例如

,例如

add_column :images, :url, :string

我遇到了这个问题,结果证明是由葡萄 API 引起的。我在堆栈跟踪中注意到在迁移期间正在读取路由文件。

在routes.rb中,挂载了Grape api。

mount API::Base => '/'

在 API 中引用了缺失的模型。因此,多亏了这个答案,我将其放在一个块中,该块可以检测它是由服务器运行还是在迁移期间运行。

unless ( File.basename($0) == "rake" && ARGV.include?("db:migrate") )
    mount API::Base => '/'
end

它奏效了。

我遇到了以下错误,并查找了我的所有应用程序代码,type_zones我找不到它。我还查看了数据库,它已更新。

原来是夹具下的文件/test/fixtures/type_zones.yml导致了麻烦。

ERROR["test_should_get_new", UsersControllerTest, 0.47265757399145514]
test_should_get_new#UsersControllerTest (0.47s)
ActiveRecord::StatementInvalid:  ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "type_zones" does not exist
    LINE 1: DELETE FROM "type_zones"
                        ^
    : DELETE FROM "type_zones"

对于仍然遇到此问题的任何人,就我而言,是我在 FactoryGirl 的工厂触发了此错误。

我试图通过".new"或".create"添加引用。

就我而言,我不得不注释掉 2ActiveAdmin文件。以下是我的步骤:

  1. 初始错误/堆栈跟踪(请注意,我们在此项目中使用了Solr(: ⇒ rkdbm java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) => Solr is already running rake aborted! PG::UndefinedTable: ERROR: relation "discussions" does not exist LINE 5: WHERE a.attrelid = '"discussions"'::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 = '"discussions"'::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:25:in block in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:1:in '/Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:3:in block in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:1:in '/Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/environment.rb:5:in ''任务:顶部 => 数据库:迁移 => 环境(通过使用 --trace 运行任务来查看完整跟踪(

我根据上面的 Arcolye 回答注释掉了app/admin/discussions.rb文件,并尝试再次迁移我的数据库。

同样的错误。

我更仔细地查看了堆栈跟踪,并注意到实际上app/admin/users.rb:25抛出了异常 - 果然,该文件依赖于我的discussions表(通过执行Discussion.all(。

最后,注释掉users.rb的内容使我最终成功地迁移了数据库。

仅供参考:ActiveAdmin 中有一个关于该 gem 是否应该在需要时加载数据库的讨论。

所以刚才有同样的问题。请记住,每次迁移中只能有一个模型。这为我解决了这个问题。

我在这里遇到了答案。

我发现了错误:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "users" does not exist
LINE 8:                WHERE a.attrelid = '"users"'::regclass

事实证明,这是一个超级简单的解决方案。我从旧版本的项目中复制了文件,但忘记将它们嵌套在"迁移"文件夹中。当我这样做时,它为我解决了问题。

当您在模型之间使用错误类型的关联、检查依赖项销毁和has_many关联时,通常会发生这种情况,例如:

可能导致此麻烦的错误方式:

文章.rb

 has_many :subcategories, through: :categories, dependent: :destroy

子类别.rb

has_and_belongs_to_many :articles

正确的方式:

文章.rb

 has_many :subcategories, through: :categories, dependent: :destroy

子类别.rb

declare association with categories here not articles (belongs_to / has_many_and_belongs_to)

忘记提交中的迁移文件可能会导致此问题。当推到英雄库例如 rails db:migrate显然是行不通的。请确保已提交定义未定义表的迁移文件。

我的情况也与FactoryGirl/FactoryBot有关,我只需要更改定义。将常量替换为字符串。

我的环境:

Rails 5.2.6
factory_bot 4.8.2

由此:

FactoryBot.define do
  factory :user, class: Admin::User do
    ...
  end
end

对此:

FactoryBot.define do
  factory :user, class: 'Admin::User' do
    ...
  end
end

这是入门 - 显式指定类所推荐的内容。

我试图运行test.rake脚本并遇到了同样的问题。花了很多时间试图了解发生了什么。最终,在我重命名文件后它得到了修复。

最新更新