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

时间:2013-09-30 15:03:25

标签: ruby-on-rails database ruby-on-rails-3 oauth-2.0 rake-task

我之前看过这个问题,但仅限于rspec。我还没有进行测试,因为它对我来说太进步了,但有一天我会尽快! :P

当我尝试使用我的应用注册/登录时出现此错误。我不确定在哪里修理它。我使用devise创建我的用户以及 omniauth2 以使用 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,但它已经创建,在架构表中存在用户。有没有人以前得到这个错误?

的database.yml

#   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
development:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_development
  pool: 5
  username: my_username
  password:

  # Connect on a TCP socket. Omitted by default since the client uses a
  # domain socket that doesn't need configuration. Windows does not have
  # domain sockets, so uncomment these lines.
  #host: localhost
  #port: 5432

  # Schema search path. The server defaults to $user,public
  #schema_search_path: myapp,sharedapp,public

  # Minimum log levels, in increasing order:
  #   debug5, debug4, debug3, debug2, debug1,
  #   log, notice, warning, error, fatal, and panic
  # The server defaults to notice.
  #min_messages: warning

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
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:

谢谢!

23 个答案:

答案 0 :(得分:105)

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

rake db:reset
  

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

     

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

如果技巧无效,请删除数据库,然后重新创建数据库,迁移数据,如果有种子,则播种数据库:

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

或简短地说(从3.2开始):

rake db:migrate:reset db:seed

由于db:migrate:reset意味着删除,因此创建并迁移数据库。因为rake的默认环境是 development ,如果您在spec测试中看到异常,则应该为 test 环境重新创建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

答案 1 :(得分:14)

您的测试数据库还没有为rspec做好准备。

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

RAILS_ENV=test rake test:prepare

它将删除,创建并向您的测试数据库添加迁移

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

RAILS_ENV=test rake db:migrate

答案 2 :(得分:13)

我遇到这个错误,并且在我的研究中, PG不可定义的错误关系用户不存在错误的原因之一是。

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

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

rake db:migrate

如果你正在使用heroku

heroku run rake db:migrate

答案 3 :(得分:12)

我有类似的错误。我的错误的根源是我在factories.rb文件中引用了Rails模型。因此它导致了加载错误问题。修复是将引用包装在一个块或{}中,以便延迟运行它。

以下是BROKEN代码:

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

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

固定代码:

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

注意:可能不是最佳做法,需要像这样调用您的模型,但这是一个干扰我的代码的解决方案。

答案 4 :(得分: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

答案 5 :(得分:10)

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

如果您正在使用ActiveAdmin,那么PG所说的表格不存在,请注释掉该ActiveAdmin rb文件的内容。

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

答案 6 :(得分:6)

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

RAILS_ENV = your_environment bundle exec rake db:migrate --trace

如果它通过,那么你刚刚找到了导致它的原因。通过Factory Girl Rails快速挖掘gem github repo,帮助我找出问题所在。

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

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)]}

有关详细信息,请参阅Dynamic Attributes part of the Factory Girl Rails docs

别忘了重命名工厂文件夹!

答案 7 :(得分:3)

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

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

答案 8 :(得分: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

这可能是铁路的一个错误,可能对某人有所帮助,而不是挣扎和疑惑。

答案 9 :(得分:3)

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

ControlPath="/Users/vinitkhandagle/.ansible/cp/%h-%r"

change_table(:users)

答案 10 :(得分:2)

(我知道这是旧的,但未来的googlers)

您使用的是devise吗?我明确知道omniauthable是一个问题,但也许是其他问题。但它不一定是devise。通常,解决方案是注释掉有问题的模型,类,无论如何,并取消评论错误所要求的任何部分。

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

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

答案是评论User模型除了devise行*以及rake db:schema:load应运行良好。

  • 否则我收到了这个错误:

    ArgumentError:在不可忽略的资源上映射omniauth_callbacks 请将devise :omniauthable添加到User模型

答案 11 :(得分:2)

删除Admin文件夹并再次运行rake。

答案 12 :(得分:2)

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

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

RAILS_ENV=test rake db:schema:load

之后问题消失了,我可以继续下一个bug。希望这能为您提供一些见解。

答案 13 :(得分:1)

最可能的原因是你的rake使用的是与database.yml不同的环境,而不是你的网络服务器。

答案 14 :(得分:1)

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

在routes.rb中安装了Grape api

mount API::Base => '/'

在API中引用了缺失的模型。所以,感谢this answer我将它放在一个块中,该块检测它是由服务器运行还是在迁移期间。

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

它有效。

答案 15 :(得分:0)

刚才遇到同样的问题。请记住每次迁移只有一个模型。这解决了我。

I came across the answer here.

答案 16 :(得分:0)

我遇到以下错误并查找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"

答案 17 :(得分:0)

对于仍然遇到此问题的人,在我的FactoryGirl工厂中,我发现了这个错误。

我试图通过&#39; .new&#39;添加引用。或者&#39; .create&#39;。

答案 18 :(得分:0)

我正在捕捉错误:

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

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

答案 19 :(得分: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)
  2. 我按Arcolye's answer above注释了block in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:1:in个文件,并尝试再次迁移我的数据库。

    同样的错误。

    我更仔细地查看了堆栈跟踪,并注意到实际上block in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:1:in抛出异常 - 果然,该文件依赖于我的app/admin/discussions.rb表(通过执行{{ 1}})。

    最后,评论app/admin/users.rb:25的内容让我最终成功地迁移了我的数据库。

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

答案 20 :(得分:0)

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

e,g。

add_column :images, :url, :string

答案 21 :(得分: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)

答案 22 :(得分:0)

在提交中忘记迁移文件可能会导致此问题。当推到heroku上时rails db:migrate显然不起作用。确保定义了未定义表的迁移文件已提交。