Невизначених користувачів PG відношення до помилок не існує


92

Я бачив це питання раніше, але лише для 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, але це вже створено: у таблиці схем існують користувачі. Хтось раніше отримував цю помилку?

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:

Чи була якась відповідь корисною?
Малъ Скрылевъ

Не для мене, маючи ту саму помилку і жодна з відповідей не була корисною.
Густаво Семіао-Лобо

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

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

Відповіді:


118

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

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передбачає падіння, створіть і перенесіть db. Оскільки типовим середовищем для rakeє розробка , у випадку, якщо ви бачите виняток у специфікаційних тестах, вам слід заново створити 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

для мене - RAILS_ENV = тестовий граблі db: drop db: create db: schema: load works, дякую за відповідь. Великий
AMIC MING

rake db:test:prepareробить роботу.
Франсіско Квінтеро

Дякую, пане, ви просто врятуєте мені життя. Я намагаюся скинути, створити, перенести, налаштувати, але жодна з цих команд не працює, доки не спробую виконати команду rake db:reset. Магія трапляється людина!
Тревіс Ле

18

Я зіткнувся з цією помилкою, і під час своїх досліджень виявив, що однією з причин невизначеного відношення помилок користувачів PG помилка не існує :

Ця помилка є помилкою міграції. Можливо, ви створили нову модель з деякими атрибутами бази даних. Після створення моделі вам потрібно перенести атрибути до вашої схеми програми rails.

Якщо ви використовуєте локальну машину, для розробки ви можете використовувати команду

rake db:migrate

Якщо ви використовуєте heroku

heroku run rake db:migrate

3
Відмінно! Для рейок 5 ви повинні використовувати 'heroku run rails db: migrate'
Рафаель Онофре,

1
Це спрацювало для мене. Мені потрібно було бігти rake db:migrate. Дякую.
Обіцяй Престон

14

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

Підготуйте тестову базу даних для rspec, щоб виправити цю помилку

RAILS_ENV=test rake test:prepare

Він видалить, створить і додасть міграції до вашої тестової бази даних

У випадку, якщо завдання rake перервано з повідомленням типу "PG :: Помилка: ПОМИЛКА: база даних" [your_db_test] "отримує доступ до інших користувачів, виконуючи це

RAILS_ENV=test rake db:migrate

12

У мене була подібна помилка. Корінь моєї помилки полягав у тому, що у моєму файлі factory.rb у мене було посилання на модель Rails. Тож це спричинило проблему з помилкою завантаження. Виправлення полягало у загортанні посилання в блок або {}так, щоб воно затримувало його запуск.

Тут був Зламаний код:

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

І це було помилкою, оскільки Userне було визначено, коли завантажувався factoryworks.rb . Я загорнув User.newвиклик у блок, і це вирішило проблему:

Виправлений код:

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

Примітка: ймовірно, це не найкраща практика, коли потрібно називати свою модель так, але це було рішення для ВИСУШЕННЯ мого коду.


Хто-небудь може пояснити, чому "називати свою модель", мабуть, не найкраща практика? Я згоден із перевагами СУХОГО ... які недоліки? Дякую!
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 каже, що не існує, прокоментуйте вміст цього файлу ActiveAdmin rb.

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


Тільки це спрацювало для мене. Ти врятував мені життя, брате! Дякую
Мікпер

5

Ця проблема для мене була спричинена рейками Factory Girl. Я рекомендую тим, хто використовує його, щоб перейменувати папку специфікацій / фабрик у специфікації / темп та спроби

RAILS_ENV = пакет вашого_ середовища exec rake db: migrate --trace

Якщо воно проходить, ви просто знайшли, що його спричинило. Швидке перекопування репозиторію gemub gemub 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 .

Не забудьте перейменувати папку своїх заводів назад!


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 на ресурс, який не є omniauthable Будь ласка, додайте devise :omniauthableдо Userмоделі


2

Якщо під час міграції з’являється ця помилка, переконайтесь, що назва вашої моделі множинна

е, г.

add_column :images, :url, :string

1

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


Привіт, як це щось, у чому я можу бути впевнений? чи є команда, яку я можу поставити в термінал?
Naomi K

і як ви запускаєте свій веб-сервер?
techvineet

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

1

У мене була ця проблема, і вона, як виявилося, спричинена Grape API . У трасі стека я помітив, що файл маршрутів читався під час міграції.

У маршрутах.rb встановлений Grape api

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. Початкова помилка / стек-стежка (зверніть увагу, ми використовуємо 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файл відповідно до відповіді Арколі вище та спробував перенести базу даних ще раз.

Та сама помилка.

Я подивився стек-трайс дещо уважніше і помітив, що насправді 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

підкатегорія.rb

has_and_belongs_to_many :articles

правильний шлях:

article.rb

 has_many :subcategories, through: :categories, dependent: :destroy

підкатегорія.rb

declare association with categories here not articles (belongs_to / has_many_and_belongs_to)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.