[英]Migration error PG::UndefinedTable: ERROR: relation “users” does not exist
[英]PG undefinedtable error relation users does not exist
我以前看到过这个问题,但只针对 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
,但它已经创建:在模式表中存在用户。 以前有人遇到过这个错误吗?
数据库.yml
配置=/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:
首先,您应该将所有连接从数据库中分离出来。 默认情况下,您使用开发环境。 然后尝试使用以下命令重置数据库:
rake db:reset
rake db:reset 任务将删除数据库并重新设置它。 这在功能上等同于 rake db:drop db:setup。
这与运行所有迁移不同。 它只会使用当前 schema.rb 文件的内容。 如果迁移无法回滚, rake db:reset 可能无济于事。 要了解有关转储架构的更多信息,请参阅架构转储和您部分。 Rails 文档
如果技巧没有帮助,删除数据库,然后重新创建它,迁移数据,如果你有种子,播种数据库:
rake db:drop db:create db:migrate db:seed
或简而言之(自 3.2 起):
rake db:migrate:reset db:seed
由于db:migrate:reset
意味着删除、创建和迁移数据库。 因为rake
的默认环境是development ,如果你在 spec 测试中看到异常,你应该为测试环境重新创建 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
我遇到了这个错误,经过我的研究,发现PG undefinedtable错误关系用户不存在错误的原因之一是:
此错误是迁移错误。 您可能创建了具有某些数据库属性的新模型。 创建模型后,您必须将属性迁移到 Rails 应用程序架构。
如果您使用的是本地机器,对于开发,您可以使用命令
rake db:migrate
如果您使用的是heroku
heroku run rake db:migrate
您的测试数据库还没有为 rspec 做好准备。
为 rspec 准备测试数据库以修复此错误
RAILS_ENV=test rake test:prepare
它将删除、创建和添加迁移到您的测试数据库
如果 rake 任务被中止,并出现“PG::Error: ERROR: database "[your_db_test]" is being accessing by other users' 之类的消息,请执行此操作
RAILS_ENV=test rake db:migrate
我有一个类似的错误。 我的错误根源在于我在 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
注意:可能不是需要像这样调用模型的最佳实践,但它是干掉我的代码的解决方案。
运行 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
的全部内容,然后在完成迁移后取消注释。
对我来说,这个问题是由 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)]}
有关更多信息,请参阅Factory Girl Rails 文档的动态属性部分。
不要忘记重命名您的工厂文件夹!
我遇到了同样的问题,然后我发现了以下解决方案。
确保您在 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
删除用户表后我遇到了这个问题。 解决方案正在改变
change_table(:users)
到
create_table(:users)
::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 的一个错误,可能会帮助某人,而不是挣扎和疑惑。
我在尝试使用 rspec 运行测试时遇到了类似的错误。
我跟着 Малъ Скрылевъ 的步骤走,但还是没能成功。 我需要做的最后一步是使用以下命令将模式加载到我的测试数据库中:
RAILS_ENV=test rake db:schema:load
之后问题就消失了,我可以继续下一个错误。 希望这能给你一些见解。
删除 Admin 文件夹并再次运行 rake。
(我知道这是旧的,但对于未来的谷歌员工)
你在使用devise
吗? 我知道特别是omniauthable
是一个问题,但也许其他人也是如此。 不过也不一定非要devise
。 通常,解决方案是注释掉有问题的模型、类等,并取消注释错误要求的任何部分。
对我来说,正在发生的事情是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
模型
如果您在迁移时遇到此错误,请确保您的模型名称是复数
例如
add_column :images, :url, :string
最可能的原因是您的 rake 使用的环境与 database.yml 不同,而不是您的网络服务器。
我遇到了以下错误,并在查找type_zones
所有应用程序代码时找不到它。 我还查看了 db,它已更新。
原来是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”添加引用。
就我而言,我不得不注释掉2 个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: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
文件,并尝试再次迁移我的数据库。
同样的错误。
我更仔细地app/admin/users.rb:25
,并注意到实际上app/admin/users.rb:25
正在抛出异常 - 果然,该文件依赖于我的discussions
表(通过执行Discussion.all
)。
最后,注释掉users.rb
的内容让我最终成功迁移了我的数据库。
仅供参考: ActiveAdmin
讨论了该 gem 是否应在需要时加载数据库。
所以刚刚遇到同样的问题。 记住在每次迁移中只有一个模型。 那为我解决了。
我发现了错误:
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "users" does not exist
LINE 8: WHERE a.attrelid = '"users"'::regclass
结果证明这是一个超级简单的修复。 我从旧版本的项目复制了文件,忘记将它们嵌套在“迁移”文件夹中。 当我这样做时,它为我解决了问题。
当您在模型之间使用错误类型的关联,检查依赖关系破坏和 has_many 关联时,通常会发生这种情况,例如:
可能导致此问题的错误方式:
文章.rb
has_many :subcategories, through: :categories, dependent: :destroy
子类别.rb
has_and_belongs_to_many :articles
正确方法:
文章.rb
has_many :subcategories, through: :categories, dependent: :destroy
子类别.rb
declare association with categories here not articles (belongs_to / has_many_and_belongs_to)
忘记提交中的迁移文件可能会导致此问题。 当在 heroku 上推送时,例如rails db:migrate
显然不起作用。 确保定义未定义表的迁移文件已经提交。
我试图运行 test.rake 脚本并遇到了同样的问题。 花了很多时间试图了解发生了什么。 最终,在我重命名文件后它得到修复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.