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

我以前看到过这个问题,但只是针对rspec。 我不是创buildtesting,因为它对我来说太早了,但有一天我会! :P

我遇到这个错误,当我尝试注册/login与我的应用程序。 我不确定在哪里寻找解决办法。 我使用devise来创build我的用户,也omn​​iauth2login与谷歌

这是错误

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 ,但是它已经创build了,在schema表中存在用户。 有没有人得到这个错误?

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: 

谢谢!

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

 rake db:reset 

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

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

如果技巧没有帮助,则删除数据库,然后重新创build它,迁移数据,如果有种子,则播种数据库:

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

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

 rake db:migrate:reset db:seed 

由于db:migrate:reset意味着drop,所以创build并迁移数据库。 由于rake的默认环境是开发 ,万一在spectesting中看到exception,您应该按照如下方式重新为testing环境创builddb:

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

或者只需加载迁移的scheme:

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

在大多数情况下,testing数据库在testing过程中正在播种,所以db:seed任务动作不需要传递。 否则,您应该准备数据库(这在Rails 4中已弃用):

 rake db:test:prepare 

然后(如果实际需要的话):

 RAILS_ENV=test rake db:seed 

您的testing数据库尚未准备好rspec。

准备你的testing数据库rspec来解决这个错误

 RAILS_ENV=test rake test:prepare 

它将删除,创build和添加迁移到您的testing数据库

如果rake任务被中止,如“PG :: Error:ERROR:database”[your_db_test]正在被其他用户访问的消息执行这一个

 RAILS_ENV=test rake db:migrate 

我有一个类似的错误。 我的错误的根源是我在我的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 

注意:可能不是最好的实践,需要像这样调用你的模型,但这是一个干我的代码的解决scheme。

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

这通常是由ActiveAdmin中的一个错误引起的。 以下是如何解决这个错误:

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

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

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

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

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

 rake db:migrate 

如果你使用的是heroku

 heroku run rake db:migrate 

这个问题对我来说是由工厂女孩铁路引起的。 我会build议那些使用它来重新命名specs / factories文件夹到规格/ 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)]} 

有关更多信息,请参阅Factory Girl Rails文档的Dynamic Attributes部分 。

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

删除用户表后,我遇到了这个问题。 解决scheme正在改变

 change_table(:users) 

 create_table(:users) 

我正在尝试使用rspec运行testing时遇到类似的错误。

我遵循了МалъСкрылевъ的步骤,但仍然是短暂的。 我需要做的最后一步是将我的模式加载到我的testing数据库中,使用:

RAILS_ENV=test rake db:schema:load

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

删除pipe理文件夹并再次运行耙。

(我知道这是旧的,但对于未来的谷歌)

你在使用devise吗? 我知道具体omniauthable是一个问题,但也许其他人也是如此。 它不一定要devise 。 一般来说,解决方法是评论出错的模型,类,不pipe怎样,并且不要评论错误所要求的任何部分。

对我来说,发生了什么是devise正在阅读User模型,看看你有什么作为devise参数(类方法,即devise :database_authenticatable, :registerable #etc

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

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

  • 否则我得到这个错误:

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

我有这个问题,原来是由葡萄API造成的。 我注意到在堆栈跟踪中,迁移过程中正在读取路由文件。

在routes.rb中,葡萄api被挂载

 mount API::Base => '/' 

并且在API中引用了缺less的模型。 所以,多亏了这个答案,我把它放在一个块中,检测它是由服务器运行还是在迁移过程中。

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

它的工作。

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

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

在浪费了几个小时之后,我终于明白迁移失踪了::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 

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

最可能的原因是你的rake使用的是不同于你的web服务器的database.yml环境。

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

  1. 初始错误/ ⇒ 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) (注意我们在这个项目上使用了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) ⇒ 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)

我在上面的每个Arcolye的答案中注释掉了app/admin/discussions.rb文件,并试图再次迁移我的数据库。

同样的错误。

我更仔细地看了一下stacktrace,注意到事实上app/admin/users.rb:25正在抛出这个exception – 果然,这个文件依赖于我的discussions表(通过执行Discussion.all )。

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

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

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

我在这里遇到了答案。

我有以下错误,并进行查找所有我的应用程序代码type_zones我无法find它。 我也看了数据库,它已经更新。

原来这是一个在fixtures /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”添加引用。