PG无法定义的错误关系用户不存在


92

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

当我尝试注册/登录我的应用程序时出现此错误。我使用devise创建用户,还使用omn​​iauth2使用google登录。

这是错误

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,但是已经创建了:在模式表中,存在用户。之前有人收到过此错误吗?

数据库

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:

有什么答案对您有帮助吗?
МалъСкрылевъ

不适合我,有同样的错误,没有答案是有帮助的。
GustavoSemião-Lobo2014年

@GustavoLobo您是否进行了适当的迁移?
МалъСкрылевъ

8
实际上,我错了,为此感到抱歉。RAILS_ENV=test rake db:migrate为我工作。
GustavoSemião-Lobo2014年

Answers:


118

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

rake db:reset

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

这与运行所有迁移不同。它将仅使用当前schema.rb文件的内容。如果无法回滚迁移,则rake db:reset可能对您没有帮助。要了解有关转储模式的更多信息,请参见“模式转储和您”部分。Rails文件

如果技巧不起作用,请删除数据库,然后重新创建数据库,迁移数据,如果有种子,请播种数据库:

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

或简而言之(从3.2开始):

rake db:migrate:reset db:seed

由于db:migrate:reset暗示删除,因此创建和迁移数据库。因为默认的环境rakedevelopment,所以如果您在规格测试中看到异常,则应该为测试环境重新创建db,如下所示:

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

对我来说-RAILS_ENV = test rake db:drop db:create db:schema:load可以工作,谢谢您的回答。很棒
AMIC MING

rake db:test:prepare做这份工作。
Francisco Quintero

谢谢先生,您救了我的命。我尝试删除,创建,迁移,设置,但是在我尝试执行命令之前,这些命令都不起作用rake db:reset。魔术发生了!
特拉维斯·勒

18

我遇到此错误,并且在研究后发现PG无法定义的错误关系用户不存在错误的原因之一是:

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

如果使用本地计算机进行开发,则可以使用命令

rake db:migrate

如果您使用的是heroku

heroku run rake db:migrate

3
优秀的!对于Rails 5,您必须使用“ heroku run rails db:migrate”
Raphael Onofre

1
这对我有用。我需要跑步rake db:migrate。谢谢。
Promise Preston

14

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

准备用于rspec的测试数据库以修复此错误

RAILS_ENV=test rake test:prepare

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

如果rake任务中止并显示诸如'PG :: Error:ERROR:的消息:其他用户正在访问数据库“ [your_db_test]”,请执行此操作

RAILS_ENV=test rake db:migrate

12

我有一个类似的错误。错误的根源是在factory.rb文件中引用了Rails模型。因此,它导致了加载错误问题。解决的办法是将引用包装在一个块中{},否则会延迟运行它。

这是破碎的代码:

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

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

固定代码:

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

注意:最好不是这样调用模型的最佳实践,但这是使我的代码干燥的一种解决方案。


谁能解释为什么“可能不需要调用模型的最佳实践”的原因?我同意DRY的好处...缺点是什么?谢谢!
theUtherSide

11

运行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

11

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

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

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


只有这个对我有用。你救了我的命!谢谢
micper

5

对我来说,这个问题是由Factory Girl滑轨引起的。我建议使用它的人将specs / factories文件夹重命名为specs / temp并尝试

RAILS_ENV =您的环境捆绑包执行rake db:migrate --trace

如果通过了,那么您只是找到了引起它的原因。快速浏览“ Factory Girl Rails” 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)]}

有关更多信息,请参考Factory Girl Rails文档的“ 动态属性”部分

不要忘记重新命名您的factory文件夹!


4

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

确保您已在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 

3

删除用户表后出现此问题。解决方案正在改变

change_table(:users)

create_table(:users)

3

::Migration[5.0]在迁移中丢失。而不是抛出语法错误,而是抛出

PG :: UndefinedTable:错误:关系角色不存在

经过数小时的浪费,我终于发现缺少移民::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

这可能是与rails相关的bug,可能会帮助某人,而不是挣扎和困惑。


是!!!尽管这是Rails 5的常见问题,但我认为这不是bug。我认为Rails故意这样做是直接从ActiveRecord继承的。
社区

2

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

我遵循了МалъСкрылевъ的步骤,但最终还是很短。我需要做的最后一步是使用以下命令将架构加载到测试数据库中:

RAILS_ENV=test rake db:schema:load

之后,问题消失了,我可以继续进行下一个错误。希望能给您一些见识。



2

(我知道这很旧,但对于未来的Google员工来说)

您正在使用devise吗?我知道具体omniauthable是一个问题,但也许其他人也是如此。不一定要devise这样。通常,解决方案是注释掉有问题的模型,类,任何内容,并取消注释错误要求的任何部分。

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

但是,它将读取整个文件,如果这不是一个新项目,则可能会依赖于其他事物的其他类方法将其绊倒(在我的情况下是friendly_idgem,然后是alias_method

答案是注释掉Userdevise行* 外的模型,并且rake db:schema:load应该运行良好。

  • 否则我得到这个错误:

    ArgumentError:在无法全部验证的资源上映射omniauth_callbacks请添加devise :omniauthableUser模型中


2

如果在迁移时遇到此错误,请确保您的模型名称为复数形式

例如。

add_column :images, :url, :string

1

最可能的原因是您的耙子使用的数据库环境与Web服务器不同。


嗨,我怎么能确定?我可以在终端中输入命令吗?
Naomi K

以及如何启动网络服务器?
techvineet

我现在正在使用终端机中的rails在本地运行
Naomi K

1

我遇到了这个问题,原来是由Grape API引起的。我在堆栈跟踪中注意到,在迁移过程中正在读取路由文件。

在routes.rb中,安装了Grape api

mount API::Base => '/'

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

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

而且有效。


1

我遇到以下错误,并且对所有应用程序代码进行了查找,因为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"


0

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

  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 `' Tasks: TOP => db:migrate => environment (See full trace by running task with --trace)

app/admin/discussions.rb根据上述Arcolye的答案注释掉了文件然后尝试再次迁移数据库。

同样的错误。

我仔细观察了一下堆栈跟踪,发现实际上app/admin/users.rb:25是在抛出异常-可以肯定的是,该文件对我的discussions表具有依赖性(通过执行Discussion.all)。

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

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



0

我正在捕捉错误:

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

事实证明,这是一个超级容易的修复程序。我已经从较旧版本的项目复制了文件,却忘记将它们嵌套在“ migrate”文件夹中。当我这样做时,它为我解决了问题。


0

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

可能导致此问题的错误方式:

article.rb

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

subcategory.rb

has_and_belongs_to_many :articles

正确的方法:

article.rb

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

subcategory.rb

declare association with categories here not articles (belongs_to / has_many_and_belongs_to)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.