PG未定义错误关系用户不存在
我以前看到过这个问题,但只是针对rspec。 我不是创buildtesting,因为它对我来说太早了,但有一天我会! :P
我遇到这个错误,当我尝试注册/login与我的应用程序。 我不确定在哪里寻找解决办法。 我使用devise来创build我的用户,也omniauth2login与谷歌 。
这是错误
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_id
gem,然后一个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
。 这是我的步骤:
- 初始错误/
⇒ 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:inblock 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:inblock 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:inblock 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”添加引用。