PG undefinedtable ошибка отношения пользователей не существует


93

Я видел этот вопрос раньше, но только для 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

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:

Был ли какой-нибудь ответ полезным?
Малъ Скрылевъ

Не для меня, такая же ошибка, и ни один из ответов не помог.
Gustavo Semião-Lobo,

@GustavoLobo у вас настроена соответствующая миграция?
Малъ Скрылевъ

8
На самом деле, я был неправ, извините за это. RAILS_ENV=test rake db:migrateработал у меня.
Густаво Семиау-Лобо,

Ответы:


119

Сначала вы должны отключить все соединения от базы данных. По умолчанию вы используете среду разработки . Затем попробуйте сбросить базу данных следующим образом:

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подразумевает удаление, создание и перенос файла db. Поскольку среда по умолчанию 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

для меня - RAILS_ENV = test rake db: drop db: create db: schema: load работает, спасибо за ответ. Отлично
AMIC MING

rake db:test:prepareделает свою работу.
Франсиско Кинтеро,

Спасибо, мистер, вы спасли мне жизнь. Я пытаюсь отбросить, создать, перенести, настроить, но ни одна из этих команд не работает, пока я не попробую вашу команду rake db:reset. Волшебство случается, чувак!
Travis Le

19

Я столкнулся с этой ошибкой и в ходе своего исследования выяснил, что одна из причин, по которой пользователи связи с ошибкой PG undefinedtable не существуют, это:

Это ошибка миграции. Возможно, вы создали новую модель с некоторыми атрибутами базы данных. После создания модели вам необходимо перенести атрибуты в схему вашего приложения rails.

Если вы используете локальный компьютер, для разработки вы можете использовать команду

rake db:migrate

Если вы используете героку

heroku run rake db:migrate

3
Превосходно! Для rails 5 вы должны использовать «heroku run rails db: migrate»
Рафаэль Онофре

1
Это сработало для меня. Мне нужно было бежать rake db:migrate. Спасибо.
Обещание Престона

14

Ваша тестовая база данных не готова для rspec.

Подготовьте тестовую базу данных для rspec, чтобы исправить эту ошибку

RAILS_ENV=test rake test:prepare

Он будет отбрасывать, создавать и добавлять миграции в вашу тестовую базу данных.

В случае, если задача rake прерывается с сообщением типа «PG :: Error: ERROR: к базе данных« [your_db_test] »обращаются другие пользователи, выполните эту

RAILS_ENV=test rake db:migrate

12

У меня была аналогичная ошибка. Корень моей ошибки заключался в том, что у меня была ссылка на модель Rails в моем файле factories.rb. Таким образом, это вызвало проблему с ошибкой загрузки. Исправление заключалось в том, чтобы поместить ссылку в блок или {}так, чтобы она задерживала его выполнение.

Вот СЛОМАННЫЙ код:

FactoryGirl.define do
  factory :user do
    guid User.new.send(:new_token)
  end
end

И это было ошибкой, потому что Userне было определено при загрузке factoryies.rb . Я User.newзаключил вызов в блок, и проблема была решена:

Фиксированный код:

FactoryGirl.define do
  factory :user do
    guid { User.new.send(:new_token) }
  end
end

Примечание: вероятно, это не лучшая практика - вызывать вашу модель таким образом, но это было решение СУШИТЬ мой код.


Может ли кто-нибудь объяснить, почему "вероятно, не лучшая практика вызывать свою модель"? Я согласен с преимуществами DRY ... каковы недостатки? Благодарность!
theUtherSide

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
 ...

Это было решено для меня после того, как я побежал

rake db:test:prepare
rake db:test:load

11

Часто это вызвано ошибкой в ​​ActiveAdmin. Вот как обойти ошибку:

Если вы используете ActiveAdmin, то какая бы таблица PG не существовала, закомментируйте содержимое этого rb-файла ActiveAdmin.

Например, в этом случае PGError: ERROR: relation "users" does not existзакомментируйте все содержимое app/admin/users.rb, а затем раскомментируйте после завершения миграции.


Только это сработало для меня. Ты спас мне жизнь, братан! Спасибо
micper

5

Эта проблема для меня была вызвана рельсами Factory Girl. Я бы порекомендовал тем, кто его использует, переименовать папку specs / factory в specs / temp и попытаться

RAILS_ENV = пакет your_environment exec rake db: migrate --trace

Если он проходит, значит, вы просто нашли причину. Быстрый поиск в репозитории 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)]}

См. Раздел Dynamic Attributes документации Factory Girl Rails. для получения дополнительной информации.

Не забудьте переименовать папку с фабриками обратно!


4

Я столкнулся с той же проблемой, а затем обнаружил следующее решение.

Убедитесь, что вы ввели все следующие учетные данные в файл 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 

3

У меня возникла эта проблема после того, как я удалил таблицу пользователей. решения менялись

change_table(:users)

к

create_table(:users)

3

::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 5. Я думаю, что rails намеренно сделали это напрямую, унаследовав от ActiveRecord.
Сообщество

2

Я получал аналогичную ошибку при попытке запустить тесты с помощью rspec.

Я пошел по стопам Малъ Скрылевъ, но все равно не смог. Последний шаг, который мне нужно было сделать, - это загрузить мою схему в мою тестовую базу данных, используя:

RAILS_ENV=test rake db:schema:load

После этого проблема исчезла, и я смог перейти к следующей ошибке. Надеюсь, это даст вам некоторое представление.



2

(Я знаю, что это старый, но для будущих гуглеров)

Вы используете 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модель


2

Если вы получаете эту ошибку во время миграции, убедитесь, что имя вашей модели во множественном числе.

например.

add_column :images, :url, :string

1

Наиболее вероятная причина заключается в том, что ваш рейк использует среду, отличную от database.yml, чем ваш веб-сервер.


Привет, как я могу быть в этом уверен? есть ли команда, которую я могу ввести в терминал?
Naomi K

и как вы запускаете свой веб-сервер?
techvineet

Я просто бегаю локально прямо сейчас, используя рельсы в терминале
Наоми К.

1

У меня была эта проблема, и оказалось, что она вызвана Grape API . Я заметил в трассировке стека, что файл маршрутов читался во время миграции.

В routes.rb смонтирован API-интерфейс Grape

mount API::Base => '/'

А в API были ссылки на отсутствующую модель. Итак, благодаря этому ответу я поместил его в блок, который определяет, запускается ли он сервером или во время миграции.

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

И это сработало.


1

У меня была следующая ошибка, и я просматривал весь код моего приложения для type_zones не смог ее найти. Я также посмотрел на db, и он был обновлен.

Оказалось, что /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"

1

Для всех, у кого все еще есть эта проблема, в моем случае это была моя фабрика в FactoryGirl, которая вызвала эту ошибку.

Я пытался добавить ссылку через .new или .create.


0

В моем случае пришлось закомментировать 2 ActiveAdmin файла. Вот мои шаги:

  1. Начальная ошибка / stacktrace (обратите внимание, что мы используем 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)

Я закомментировал app/admin/discussions.rbфайл в ответе Арколая выше и снова попытался перенести мою базу данных.

Та же ошибка.

Я внимательно посмотрел на stacktrace и заметил, что на самом деле app/admin/users.rb:25это исключение - и, конечно же, этот файл имеет зависимость от моей discussionsтаблицы (через выполнение Discussion.all).

Наконец, комментирование содержимого users.rbпозволило мне наконец успешно перенести мою базу данных.

FYI: есть обсуждение здесь в ActiveAdminо том, следует ли , что камень загрузки базы данных , когда это требуется.



0

Я поймал ошибку:

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

Это оказалось очень легко исправить. Я скопировал файлы из более старой версии проекта и забыл вложить их в папку «миграции». Когда я это сделал, проблема была решена для меня.


0

обычно это может произойти, когда вы используете неправильный тип ассоциации между моделями, проверяете наличие зависимости уничтожения и ассоциаций 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)

0

Эта проблема может возникнуть из-за того, что вы забыли файл миграции в вашей фиксации. При нажатии на героку, например rails db:migrate, очевидно, не будет работать. Убедитесь, что файл миграции, определяющий неопределенную таблицу, был зафиксирован.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.