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

Nao*_*i K 88 database ruby-on-rails oauth-2.0 rake-task ruby-on-rails-3

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

当我尝试使用我的应用注册/登录时出现此错误.我不知道在哪里修理它.我使用devise来创建我的用户,并使用omn​​iauth2来登录谷歌.

这是错误

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
Run Code Online (Sandbox Code Playgroud)

我试过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:
Run Code Online (Sandbox Code Playgroud)

谢谢!

Мал*_*евъ 111

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

rake db:reset
Run Code Online (Sandbox Code Playgroud)

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

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

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

rake db:drop db:create db:migrate db:seed
Run Code Online (Sandbox Code Playgroud)

或者简短的方式(从3.2开始):

rake db:migrate:reset db:seed
Run Code Online (Sandbox Code Playgroud)

由于db:migrate:reset暗示删除,创建和迁移数据库.因为默认环境rake开发,如果您在规范测试中看到异常,您应该为测试环境重新创建db,如下所示:

RAILS_ENV=test rake db:drop db:create db:migrate
Run Code Online (Sandbox Code Playgroud)

或者只是加载迁移的方案:

RAILS_ENV=test rake db:drop db:create db:schema:load
Run Code Online (Sandbox Code Playgroud)

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

rake db:test:prepare
Run Code Online (Sandbox Code Playgroud)

然后(如果实际需要):

RAILS_ENV=test rake db:seed
Run Code Online (Sandbox Code Playgroud)

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

RAILS_ENV=test rake db:environment:set db:drop db:create db:migrate
Run Code Online (Sandbox Code Playgroud)

  • `rake db:test:prepare` 可以完成这项工作。 (2认同)

Ser*_*kyy 14

您的测试数据库尚未准备好进行rspec.

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

RAILS_ENV=test rake test:prepare
Run Code Online (Sandbox Code Playgroud)

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

如果rake任务被中止,并且消息如'PG ::错误:错误:数据库'[your_db_test]"正被其他用户访问'执行这个

RAILS_ENV=test rake db:migrate
Run Code Online (Sandbox Code Playgroud)


sup*_*289 14

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

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

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

rake db:migrate
Run Code Online (Sandbox Code Playgroud)

如果你正在使用heroku

heroku run rake db:migrate
Run Code Online (Sandbox Code Playgroud)

  • 优秀!对于rails 5,您必须使用'heroku run rails db:migrate' (2认同)

小智 12

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

这是BROKEN代码:

FactoryGirl.define do
  factory :user do
    guid User.new.send(:new_token)
  end
end
Run Code Online (Sandbox Code Playgroud)

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

固定代码:

FactoryGirl.define do
  factory :user do
    guid { User.new.send(:new_token) }
  end
end
Run Code Online (Sandbox Code Playgroud)

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


Arc*_*lye 11

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

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

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


ced*_*dlb 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
 ...
Run Code Online (Sandbox Code Playgroud)

跑完之后我就解决了

rake db:test:prepare
rake db:test:load
Run Code Online (Sandbox Code Playgroud)


Igi*_*oto 5

对我来说这个问题是由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
Run Code Online (Sandbox Code Playgroud)

将数组封装在一个块中(添加{})为我做了修复.请注意,payment_options可以在示例中使用多个付款选项...

payment_options {[Billing::PaymentOption.new(term: 1, payment_term: 1)]}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Factory Girl Rails文档动态属性部分.

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


tec*_*eet 2

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