PG неопределенная ошибка отношения пользователей не существует
Я вижу этот вопрос раньше, но только для rspec. Я еще не создал тест, потому что он слишком продвинут для меня, но однажды я это сделаю!:П
Я получаю эту ошибку, когда я пытаюсь зарегистрироваться / войти в систему с моим приложением. Я не уверен, где искать, чтобы это исправить. Я использую 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
# 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:
Спасибо!
25 ответов
Сначала вы должны отсоединить все соединения от базы данных. По умолчанию вы используете среду разработки. Затем попробуйте сбросить базу данных следующим образом:
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
Это разработка, в случае если вы видите исключение в тестах спецификаций, вы должны заново создать базу данных для тестовой среды следующим образом:
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 неопределяемой ошибки в отношении пользователей не существует, является ошибка.
Эта ошибка является ошибкой миграции. Возможно, вы создали новую модель с некоторыми атрибутами базы данных. После создания модели вы должны перенести атрибуты в вашу схему приложения rails.
Если вы используете локальную машину для разработки, вы можете использовать команду
rake db:migrate
Если вы используете героку
heroku run rake db:migrate
Ваша тестовая база данных не готова к rspec.
Подготовьте тестовую базу данных для rspec, чтобы исправить эту ошибку
RAILS_ENV=test rake test:prepare
Он будет отбрасывать, создавать и добавлять миграции в вашу тестовую базу данных.
В случае, если задача rake прервана с сообщением типа "PG:: Ошибка: ОШИБКА: доступ к базе данных"[your_db_test]"другими пользователями", выполните это
RAILS_ENV=test rake db:migrate
Я также получил эту ошибку при запуске 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
У меня была похожая ошибка. Корень моей ошибки заключался в том, что в моем файле factories.rb была ссылка на модель Rails. Так что это вызвало ошибку загрузки. Исправление заключалось в том, чтобы обернуть ссылку в блок или {}
так что это задерживает его запуск.
Вот код BROKEN:
FactoryGirl.define do
factory :user do
guid User.new.send(:new_token)
end
end
И это было ошибкой, потому что User
не был определен при загрузке factories.rb. Я завернул User.new
позвонить в блок, и это решило проблему:
Фиксированный код:
FactoryGirl.define do
factory :user do
guid { User.new.send(:new_token) }
end
end
Примечание: вероятно, не рекомендуется использовать такую модель для вызова вашей модели, но это было решение, чтобы высушить мой код.
Это часто вызывается ошибкой в ActiveAdmin. Вот как обойти ошибку:
Если вы используете ActiveAdmin, какую бы таблицу не указали в PG, закомментируйте содержимое этого rb-файла ActiveAdmin.
Например, для этого случая PGError: ERROR: relation "users" does not exist
закомментируйте все содержимое app/admin/users.rb
, затем раскомментируйте после того, как вы сделали свои миграции.
Эта проблема для меня была вызвана рельсами Factory Girl. Я бы порекомендовал тем, кто использует его, переименовать папку specs/factories в specs/temp и попробовать
RAILS_ENV=your_environment, комплект exec rake db: мигрировать --trace
Если это пройдет, значит, вы только что нашли причину. Быстрое копание в репозитории gem github от Factory Girl Rails помогло мне выявить проблему.
Заводы терпели неудачу, потому что я пытался создать модель, которая не существовала при запуске! Пример кода ниже:
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
::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
Это может быть ошибка с рельсами и может помочь кому-то, вместо того, чтобы бороться и удивляться.
У меня была эта проблема после того, как я удалил таблицу пользователей. решения менялись
change_table(:users)
в
create_table(:users)
Если вы получаете эту ошибку во время миграции, убедитесь, что название вашей модели множественное
например.
add_column :images, :url, :string
Наиболее вероятная причина заключается в том, что ваш рейк использует другую среду из database.yml, чем ваш веб-сервер.
Я получал похожую ошибку при попытке запустить тесты с использованием rspec.
Я пошел по стопам Малъ Скрылевъ, но все равно оказался коротким. Последний шаг, который мне нужно было сделать, это загрузить мою схему в мою тестовую базу данных, используя:
RAILS_ENV=test rake db:schema:load
После этого проблема ушла, и я мог перейти к следующей ошибке. Надеюсь, это даст вам некоторое представление.
(Я знаю, что это старый, но для будущих гуглеров)
Ты используешь devise
? Я знаю конкретно omniauthable
это проблема, но может быть и другие. Это не должно быть devise
хоть. Обычно решение состоит в том, чтобы закомментировать модель, класс и все, что нарушает, и откомментировать любые разделы, которые запрашивают ошибки.
Для меня то, что происходило в том, что devise
читает User
модель, чтобы увидеть, что у вас есть в качестве аргументов для devise
(метод класса т.е. devise :database_authenticatable, :registerable #etc
)
Но он будет читать весь файл, и если это не новый проект, он может быть отключен другими методами класса, полагаясь на другие вещи (в моем случае это был friendly_id
драгоценный камень, а затем alias_method
Ответ был закомментировать User
модель за исключением devise
строки (и) * и rake db:schema:load
должен работать нормально.
в противном случае я получил эту ошибку:
ArgumentError: Сопоставление omniauth_callbacks с ресурсом, который не может быть исключен. Добавьте
devise :omniauthable
кUser
модель
У меня была следующая ошибка, и я выполнял поиск по всему коду моего приложения для 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"
У меня была эта проблема, и она оказалась вызвана Grape API. В трассировке стека я заметил, что файл маршрутов читается во время миграции.
В roads.rb смонтирован Виноградный API
mount API::Base => '/'
А в API были ссылки на отсутствующую модель. Итак, благодаря этому ответу я поместил его в блок, который определяет, запускается ли он сервером или во время миграции.
unless ( File.basename($0) == "rake" && ARGV.include?("db:migrate") )
mount API::Base => '/'
end
И это сработало.
Для тех, у кого все еще есть эта проблема, на моей фабрике была FactoryGirl, которая вызывала эту ошибку.
Я пытался добавить ссылку через ".new" или ".create".
Я пытался запустить скрипт test.rake и столкнулся с той же проблемой. Потратил много времени, пытаясь понять, что происходит. В конце концов, это было исправлено после того, как я переименовал файл.
Мой случай также был связан с
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
Что рекомендуется в разделе « Начало работы» — явное указание класса .
Эта проблема может возникнуть из-за того, что вы забыли файл миграции в вашей фиксации. При нажатии на героку, например
rails db:migrate
явно не сработает. Убедитесь, что файл миграции, определяющий неопределенную таблицу, был зафиксирован.
Так что сейчас возникла та же проблема. Не забудьте иметь только одну модель в каждой миграции. Это решило это для меня.
Я ловил ошибку:
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "users" does not exist
LINE 8: WHERE a.attrelid = '"users"'::regclass
Это оказалось очень легко исправить. Я скопировал файлы из более старой версии проекта и забыл поместить их в папку "миграции". Когда я это сделал, это решило проблему для меня.
Обычно это может произойти, когда вы используете неправильный тип ассоциации между моделями, проверяете наличие зависимости уничтожения и ассоциаций has_many, например:
неправильный способ, который может вызвать эту проблему:
article.rb
has_many :subcategories, through: :categories, dependent: :destroy
subcategory.rb
has_and_belongs_to_many :articles
правильно:
article.rb
has_many :subcategories, through: :categories, dependent: :destroy
subcategory.rb
declare association with categories here not articles (belongs_to / has_many_and_belongs_to)
В моем случае мне пришлось закомментировать 2 ActiveAdmin
файлы. Вот мои шаги:
- Начальная ошибка / трассировка стека (обратите внимание, мы используем
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 `' Задачи: TOP => db:migrate => среда (полная трассировка выполняется путем запуска задачи с помощью --trace)
Я закомментировал app/admin/discussions.rb
в ответ на ответ Arcolye выше и попытался перенести мою базу данных снова.
Та же ошибка
Я посмотрел на трассировку стека немного внимательнее и заметил, что на самом деле app/admin/users.rb:25
выдает исключение - и, конечно же, этот файл зависит от моего discussions
стол (через выполнение Discussion.all
).
Наконец, комментируя содержимое users.rb
позволил мне, наконец, успешно перенести мою базу данных.
К вашему сведению: здесь есть обсуждение ActiveAdmin
о том, должен ли этот гем загружать базу данных при необходимости.