Я видел этот вопрос раньше, но только для 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:
RAILS_ENV=test rake db:migrate
работал у меня.Ответы:
Сначала вы должны отключить все соединения от базы данных. По умолчанию вы используете среду разработки . Затем попробуйте сбросить базу данных следующим образом:
rake db:reset
Если уловка не помогает, отбросьте базу данных, затем заново создайте ее, перенесите данные и, если у вас есть семена, засевайте базу данных:
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
источник
rake db:test:prepare
делает свою работу.rake db:reset
. Волшебство случается, чувак!Я столкнулся с этой ошибкой и в ходе своего исследования выяснил, что одна из причин, по которой пользователи связи с ошибкой PG undefinedtable не существуют, это:
Это ошибка миграции. Возможно, вы создали новую модель с некоторыми атрибутами базы данных. После создания модели вам необходимо перенести атрибуты в схему вашего приложения rails.
Если вы используете локальный компьютер, для разработки вы можете использовать команду
rake db:migrate
Если вы используете героку
heroku run rake db:migrate
источник
rake db:migrate
. Спасибо.Ваша тестовая база данных не готова для rspec.
Подготовьте тестовую базу данных для rspec, чтобы исправить эту ошибку
RAILS_ENV=test rake test:prepare
Он будет отбрасывать, создавать и добавлять миграции в вашу тестовую базу данных.
В случае, если задача rake прерывается с сообщением типа «PG :: Error: ERROR: к базе данных« [your_db_test] »обращаются другие пользователи, выполните эту
RAILS_ENV=test rake db:migrate
источник
У меня была аналогичная ошибка. Корень моей ошибки заключался в том, что у меня была ссылка на модель 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
Примечание: вероятно, это не лучшая практика - вызывать вашу модель таким образом, но это было решение СУШИТЬ мой код.
источник
Я также получал эту ошибку при запуске 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 не существовала, закомментируйте содержимое этого rb-файла ActiveAdmin.
Например, в этом случае
PGError: ERROR: relation "users" does not exist
закомментируйте все содержимоеapp/admin/users.rb
, а затем раскомментируйте после завершения миграции.источник
Эта проблема для меня была вызвана рельсами 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. для получения дополнительной информации.
Не забудьте переименовать папку с фабриками обратно!
источник
Я столкнулся с той же проблемой, а затем обнаружил следующее решение.
Убедитесь, что вы ввели все следующие учетные данные в файл 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]
отсутствовал в миграциях. вместо выдачи синтаксической ошибки он выдаетпотратив часы впустую, я наконец понял, что миграция отсутствует
::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
Это могло быть ошибкой с рельсами и могло помочь кому-то, вместо того, чтобы бороться и удивляться.
источник
Я получал аналогичную ошибку при попытке запустить тесты с помощью rspec.
Я пошел по стопам Малъ Скрылевъ, но все равно не смог. Последний шаг, который мне нужно было сделать, - это загрузить мою схему в мою тестовую базу данных, используя:
RAILS_ENV=test rake db:schema:load
После этого проблема исчезла, и я смог перейти к следующей ошибке. Надеюсь, это даст вам некоторое представление.
источник
Удалите папку Admin и снова запустите rake.
источник
(Я знаю, что это старый, но для будущих гуглеров)
Вы используете
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
модельисточник
Если вы получаете эту ошибку во время миграции, убедитесь, что имя вашей модели во множественном числе.
например.
add_column :images, :url, :string
источник
Наиболее вероятная причина заключается в том, что ваш рейк использует среду, отличную от database.yml, чем ваш веб-сервер.
источник
У меня была эта проблема, и оказалось, что она вызвана Grape API . Я заметил в трассировке стека, что файл маршрутов читался во время миграции.
В routes.rb смонтирован API-интерфейс Grape
mount API::Base => '/'
А в API были ссылки на отсутствующую модель. Итак, благодаря этому ответу я поместил его в блок, который определяет, запускается ли он сервером или во время миграции.
unless ( File.basename($0) == "rake" && ARGV.include?("db:migrate") ) mount API::Base => '/' end
И это сработало.
источник
У меня была следующая ошибка, и я просматривал весь код моего приложения для
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"
источник
Для всех, у кого все еще есть эта проблема, в моем случае это была моя фабрика в FactoryGirl, которая вызвала эту ошибку.
Я пытался добавить ссылку через .new или .create.
источник
В моем случае пришлось закомментировать 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 `' 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
о том, следует ли , что камень загрузки базы данных , когда это требуется.источник
Так что сейчас та же проблема. Не забывайте использовать только одну модель в каждой миграции. Это решило проблему для меня.
Я нашел здесь ответ.
источник
Я поймал ошибку:
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)
источник
Эта проблема может возникнуть из-за того, что вы забыли файл миграции в вашей фиксации. При нажатии на героку, например
rails db:migrate
, очевидно, не будет работать. Убедитесь, что файл миграции, определяющий неопределенную таблицу, был зафиксирован.источник