【问题标题】:PG undefinedtable error relation users does not existPG undefinedtable 错误关系用户不存在
【发布时间】:2013-10-06 12:19:14
【问题描述】:

我以前看到过这个问题,但只针对 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

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:

【问题讨论】:

  • 有任何答案有帮助吗?
  • 不适合我,有同样的错误,没有一个答案有帮助。
  • @GustavoLobo 你有适当的迁移设置吗?
  • 其实我错了,抱歉。 RAILS_ENV=test rake db:migrate 为我工作。

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


【解决方案1】:

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

【讨论】:

  • 嗨,我怎么能确定?我可以在终端中输入命令吗?
  • 你是如何启动你的网络服务器的?
  • 我现在只是在终端使用 rails s 在本地运行
【解决方案2】:

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

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

RAILS_ENV=test rake test:prepare

它将删除、创建和添加迁移到您的测试数据库

如果 rake 任务中止并显示类似 'PG::Error: ERROR: database "[your_db_test]" 正在被其他用户访问的消息,请执行此操作

RAILS_ENV=test rake db:migrate

【讨论】:

    【解决方案3】:

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

    rake db:reset
    

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

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

    【讨论】:

    • 对我来说 - RAILS_ENV=test rake db:drop db:create db:schema:load 有效,感谢您的回答。很棒
    • rake db:test:prepare 完成这项工作。
    • 谢谢先生,你救了我的命。我尝试删除、创建、迁移、设置,但在我尝试使用命令 rake db:reset 之前,这些命令中的任何一个都不起作用。奇迹发生了!
    • 我在尝试迁移时不小心删除了我的 PG 表并收到此错误。更改/更改迁移和架构文件一直是我的焦虑。对我来说,我删除了一个表,出于某种原因,PG 仍然在模式中识别它。我运行 rails db:reset 只是为了在本地删除并创建所有内容,然后它重新调整了所有内容。
    【解决方案4】:

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

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

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

    【讨论】:

    • 只有这对我有用。你救了我的命兄弟!谢谢
    • 你也可以在路由上评论所有管理区域:# ActiveAdmin.routes(self)
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      就我而言,我必须注释掉 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)

      我根据Arcolye's answer above 注释掉了app/admin/discussions.rb 文件,并尝试再次迁移我的数据库。

      同样的错误。

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

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

      仅供参考:hereActiveAdmin 中讨论过该 gem 是否应在需要时加载数据库。

      【讨论】:

        【解决方案7】:

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

        我跟着 Малъ Скрылевъ 的步骤,但最终还是失败了。我需要做的最后一步是将我的模式加载到我的测试数据库中:

        RAILS_ENV=test rake db:schema:load

        在那之后问题就消失了,我可以继续处理下一个错误。希望这能给您一些见解。

        【讨论】:

          【解决方案8】:

          我遇到了类似的错误。我的错误的根源是我在 factory.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
          

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

          【讨论】:

          • 谁能解释一下为什么“需要调用你的模型可能不是最佳实践”?我同意 DRY 的好处……有什么缺点?谢谢!
          【解决方案9】:

          我在删除 users 表后遇到了这个问题。解决方案正在改变

          change_table(:users)
          

          create_table(:users)
          

          【讨论】:

            【解决方案10】:

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

            I came across the answer here.

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                【解决方案12】:

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

                你在使用devise吗?我特别知道omniauthable 是一个问题,但也许其他人也是如此。不过,它不一定是devise。通常,解决方案是注释掉有问题的模型、类等,并取消注释错误要求的任何部分。

                对我来说,发生的事情是 devise 正在读取 User 模型以查看您将哪些内容作为 devise 的参数(类方法 即devise :database_authenticatable, :registerable #etc)

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

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

                • 否则我得到这个错误:

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

                【讨论】:

                  【解决方案13】:

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

                  在 routes.rb 中挂载了 Grape api

                  mount API::Base => '/'
                  

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

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

                  它奏效了。

                  【讨论】:

                    【解决方案14】:

                    我遇到了这个错误,经过研究,发现PG undefinedtable error relationship users does not exist错误的原因之一是:

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

                    如果你使用本地机器,开发,你可以使用命令

                    rake db:migrate
                    

                    如果你使用的是heroku

                    heroku run rake db:migrate
                    

                    【讨论】:

                    • 太棒了!对于 rails 5,您必须使用 'heroku run rails db:migrate'
                    • 这对我有用。我需要运行rake db:migrate。谢谢。
                    • 当我将表名从 article 更改为 blog_article 而不是将模型类名称更改为 BlogArticle 时,我也遇到了这个问题,我仍然将模型类的名称保留为Article
                    【解决方案15】:

                    对我来说,这个问题是由 Factory Girl rails 引起的。我建议那些使用它的人将 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 了解更多信息。

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

                    【讨论】:

                      【解决方案16】:

                      我遇到以下错误,并在我的所有应用程序代码中查找 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】:

                        ::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 的一个错误,可能会对某人有所帮助,而不是苦苦思索。

                        【讨论】:

                        【解决方案18】:

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

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

                        【讨论】:

                          【解决方案19】:

                          我发现了错误:

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

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

                          【讨论】:

                            【解决方案20】:

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

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

                            【讨论】:

                              【解决方案21】:

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

                              例如,例如。

                              add_column :images, :url, :string
                              

                              【讨论】:

                                【解决方案22】:

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

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

                                article.rb

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

                                子类别.rb

                                has_and_belongs_to_many :articles
                                

                                正确的方式:

                                article.rb

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

                                子类别.rb

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

                                【讨论】:

                                  【解决方案23】:

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

                                  【讨论】:

                                    【解决方案24】:

                                    我的案例也与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
                                    

                                    这是Getting Started - Specifying the class explicitly推荐的东西。

                                    【讨论】:

                                      猜你喜欢
                                      • 2016-03-18
                                      • 1970-01-01
                                      • 2020-05-08
                                      • 2021-03-03
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2021-02-05
                                      • 2017-11-16
                                      相关资源
                                      最近更新 更多