it-roy-ru.com

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:

Спасибо!

76
Naomi K

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

rake db:reset

Задача rake db: reset удалит базу данных и снова настроит ее. Это функционально эквивалентно rake db: drop db: setup.

Это не то же самое, что запускать все миграции. Он будет использовать только содержимое текущего файла schema.rb. Если миграция не может быть отменена, rake db: сброс может вам не помочь. Чтобы узнать больше о дампе схемы, смотрите Схема дампинга и вы в разделе. Rails Docs

Если хитрость не помогает, удалите базу данных, затем заново создайте ее, перенесите данные, и, если у вас есть семена, высейте базу данных:

rake db:drop db:create db:migrate db:seed

или кратко (начиная с 3.2):

rake db:migrate:reset db:seed

Поскольку db:migrate:reset подразумевает удаление, создание и перенос БД. Поскольку средой по умолчанию для rake является разработка, в случае, если вы видите исключение в тестах спецификаций, вам следует заново создать db для среды test следующим образом:

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
103
Малъ Скрылевъ

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

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

Rails_ENV=test rake test:prepare

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

В случае, если задача rake прервана с сообщением типа «PG :: Ошибка: ОШИБКА: доступ к базе данных« [your_db_test] »другими пользователями», выполните это

Rails_ENV=test rake db:migrate
14
Serge Seletskyy

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

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

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

rake db:migrate

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

heroku run rake db:migrate
12
supritshah1289

У меня была похожая ошибка. Корень моей ошибки заключался в том, что в моем файле 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

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

12
ehc

Я также получил эту ошибку при запуске 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
cedricdlb

Это часто вызывается ошибкой в ​​ActiveAdmin. Вот как обойти ошибку:

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

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

10
Arcolye

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

Rails_ENV = your_environment, комплект exec rake db: migrate --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 для получения дополнительной информации.

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

6
Igi Manaloto

::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 и может помочь кому-то, вместо того, чтобы бороться и удивляться.

3
Kaleem Ullah

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

change_table(:users)

в

create_table(:users)
3
KnuturO

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

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

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

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

Rails_ENV=test rake db:schema:load

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

2
Stephen

Удалите папку Admin и снова запустите rake.

2
Roberto Capelo

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

Вы используете devise? Я знаю, в частности, omniauthable это проблема, но может быть и другие. Это не должно быть devise все же. Обычно решение состоит в том, чтобы закомментировать модель, класс и все, что нарушает, и откомментировать любые разделы, которые запрашивают ошибки.

Для меня то, что происходило, заключается в том, что devise читает модель User, чтобы увидеть, что у вас есть в качестве аргументов для devise (метод класса I.e. devise :database_authenticatable, :registerable #etc)

Но он будет читать весь файл, и если это не новый проект, он может быть отключен другими методами класса, основанными на других вещах (в моем случае это был гем friendly_id, а затем alias_method

Ответ состоял в том, чтобы закомментировать модель User, за исключением того, что строки devise * и rake db:schema:load должны работать нормально.

  • в противном случае я получил эту ошибку:

    ArgumentError: Сопоставление omniauth_callbacks с ресурсом, который не является omniauthable Пожалуйста, добавьте devise :omniauthable в модель User

1
MCB

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

1
techvineet

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

В rout.rb смонтирован Виноградный API

mount API::Base => '/'

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

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

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

1
Julian Mann

Так что сейчас возникла та же проблема. Не забудьте иметь только одну модель в каждой миграции. Это решило это для меня. 

Я наткнулся на ответ здесь.

0
Rex

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

например. 

add_column :images, :url, :string
0
user5783745

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

  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'/Пользователи/matthewcampbell/Сайты/код/​​создатели стека/AchieveX/config/rout.rb: 3: в block in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:1:in ' /Users/matthewcampbell/Сайты/код/​​построители стека/AchieveX/config/environment.rb: 5: in `' Задачи: TOP => db: migrate => environment (Смотрите полную трассировку запустив задачу с --trace) </ code>

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

Та же ошибка.

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

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

К вашему сведению: есть обсуждение здесь в ActiveAdmin о том, должен ли этот гем загружать базу данных при необходимости.

0
mecampbellsoup

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

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

0
Mateus Luiz

Я ловил ошибку:

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

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

0
John Chriest

У меня была следующая ошибка, и я искал весь код моего приложения для 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"
0
juliangonzalez