Los usuarios de relación de error indefinible de PG no existen

92

Vi esta pregunta antes, pero solo para rspec. Aún no he creado la prueba porque es demasiado avanzada para mí, ¡pero pronto lo haré! :PAGS

Recibo este error cuando intento registrarme / iniciar sesión en mi aplicación. Usé devise para crear un usuario y también omniauth2 para iniciar sesión con google .

este es el error

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

Lo intenté rake db:migrate, pero ya está creado: en la tabla de esquema existen usuarios. ¿Alguien ha recibido este error antes?

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:
Naomi K
fuente
¿Alguna respuesta ha sido útil?
Малъ Скрылевъ
No para mí, tener el mismo error y ninguna de las respuestas ha sido útil.
Gustavo Semião-Lobo
@GustavoLobo, ¿tienes una migración adecuada?
Малъ Скрылевъ
8
En realidad, estaba equivocado, lo siento. RAILS_ENV=test rake db:migratetrabajó para mi.
Gustavo Semião-Lobo

Respuestas:

118

Al principio, deberá desconectar todas las conexiones de la base de datos. De forma predeterminada, utiliza el entorno de desarrollo . Luego intente restablecer la base de datos con lo siguiente:

rake db:reset

La tarea rake db: reset eliminará la base de datos y la configurará de nuevo. Esto es funcionalmente equivalente a rake db: drop db: setup.

Esto no es lo mismo que ejecutar todas las migraciones. Solo usará el contenido del archivo schema.rb actual. Si no se puede revertir una migración, es posible que rake db: reset no lo ayude. Para obtener más información sobre cómo volcar el esquema, consulte la sección El volcado de esquemas y usted. Rails Docs

Si el truco no ayuda, elimine la base de datos, luego vuelva a crearla, migre los datos y, si tiene semillas, siembre la base de datos:

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

o en resumen (desde 3.2):

rake db:migrate:reset db:seed

Dado que db:migrate:resetimplica eliminar, crear y migrar el archivo db. Debido a que el entorno predeterminado para rakees el desarrollo , en caso de que vea la excepción en las pruebas de especificaciones, debe volver a crear la base de datos para el entorno de prueba de la siguiente manera:

RAILS_ENV=test rake db:drop db:create db:migrate

o con solo cargar el esquema migrado:

RAILS_ENV=test rake db:drop db:create db:schema:load

En la mayoría de los casos, la base de datos de prueba se siembra durante los procedimientos de prueba, por db:seedlo que no es necesario aprobar la acción de la tarea. De lo contrario, deberá preparar la base de datos (esto está obsoleto en Rails 4 ):

rake db:test:prepare

y luego (si es realmente necesario):

RAILS_ENV=test rake db:seed

En las versiones más recientes de Rails, el error ActiveRecord :: NoEnvironmentInSchemaError puede aparecer, así que anteponga las tareas con un entorno de base de datos establecido task: db: environment: set :

RAILS_ENV=test rake db:environment:set db:drop db:create db:migrate
Малъ Скрылевъ
fuente
para mí - RAILS_ENV = test rake db: drop db: create db: schema: load funciona, gracias por la respuesta. Genial
AMIC MING
rake db:test:preparehace el trabajo.
Francisco Quintero
Gracias, señor, acaba de salvarme la vida. Intento eliminar, crear, migrar, configurar, pero ninguno de esos comandos funciona hasta que pruebo tu comando rake db:reset. ¡La magia sucede hombre!
Travis Le
18

Encontré este error y, tras mi investigación, descubrí que una de las razones de usuarios de relación de error indefinible de PG no existe es:

Este error es un error de migración. Es posible que haya creado un nuevo modelo con algunos atributos de la base de datos. Después de crear el modelo, debe migrar los atributos al esquema de la aplicación Rails.

Si está utilizando una máquina local, para el desarrollo, puede utilizar el comando

rake db:migrate

Si estás usando heroku

heroku run rake db:migrate
supritshah1289
fuente
3
¡Excelente! Para rails 5 debes usar 'heroku run rails db: migrate'
Raphael Onofre
1
Esto funcionó para mí. Necesitaba correr rake db:migrate. Gracias.
Promesa Preston
14

Su base de datos de prueba no está lista para rspec.

Prepare su base de datos de prueba para rspec para corregir este error

RAILS_ENV=test rake test:prepare

Soltará, creará y agregará migraciones a su base de datos de prueba

En caso de que la tarea de rake se cancele con un mensaje como 'PG :: Error: ERROR: otros usuarios están accediendo a la base de datos "[your_db_test]", ejecute esta

RAILS_ENV=test rake db:migrate
Serge Seletskyy
fuente
12

Tuve un error similar. La raíz de mi error fue que tenía una referencia a un modelo de Rails en mi archivo factories.rb. Entonces causó un problema de error de carga. La solución fue envolver la referencia en un bloque o{} para retrasar su ejecución.

Aquí estaba el código ROTO:

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

Y fue un error porque Userno se definió cuando se estaba cargando factories.rb. Envolví la User.newllamada en un bloque y resolvió el problema:

Código fijo:

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

Nota: probablemente no sea la mejor práctica para necesitar llamar a su modelo de esta manera, pero fue una solución para SECAR mi código.

ehc
fuente
¿Alguien puede explicar por qué "probablemente no sea una buena práctica tener que llamar a su modelo"? Estoy de acuerdo con los beneficios de DRY ... ¿cuáles son los inconvenientes? ¡Gracias!
theUtherSide
11

También recibía este error al ejecutar 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
 ...

Se resolvió para mí después de que corrí

rake db:test:prepare
rake db:test:load
cedricdlb
fuente
11

Esto a menudo es causado por un error en ActiveAdmin. A continuación, le indicamos cómo solucionar el error:

Si está utilizando ActiveAdmin, cualquier tabla que PG diga que no existe, comente el contenido de ese archivo rb de ActiveAdmin.

Por ejemplo, para este caso PGError: ERROR: relation "users" does not exist, comente todo el contenido de app/admin/users.rb, luego descomente después de haber realizado sus migraciones.

Arcolye
fuente
Solo esto funcionó para mí. ¡Me salvaste la vida hermano! Gracias
micper
5

Ese problema para mí fue causado por los rieles de Factory Girl. Recomendaría a quienes lo usen cambiar el nombre de la carpeta de especificaciones / fábricas a especificaciones / temperatura e intentar

RAILS_ENV = su_environment bundle exec rake db: migrate --trace

Si pasa, entonces acaba de encontrar la causa. Una búsqueda rápida en el repositorio de github de gemas de Factory Girl Rails me ayudó a identificar el problema.

¡Las fábricas estaban fallando porque estaba tratando de crear una instancia de un modelo que no existía al ejecutarse! Ejemplo de código a continuación:

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

Encapsular la matriz en un bloque (agregar {}) me solucionó. Tenga en cuenta que payment_options puede tomar más de una opción de pago en el ejemplo ...

payment_options {[Billing::PaymentOption.new(term: 1, payment_term: 1)]}

Consulte la parte de atributos dinámicos de los documentos de Factory Girl Rails para obtener más información.

¡No olvide cambiar el nombre de la carpeta de fábricas!

Igi Manaloto
fuente
4

Estaba enfrentando el mismo problema y luego descubrí la siguiente solución.

Asegúrese de haber ingresado todas las siguientes credenciales en el archivo database.yml y que sean correctas:

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 
Muhammad Zubair
fuente
3

Tuve este problema después de eliminar la tabla de usuarios. las soluciones estaban cambiando

change_table(:users)

a

create_table(:users)
KnuturO
fuente
3

::Migration[5.0]faltaba en las migraciones. en lugar de arrojar un error de sintaxis , arroja

PG :: UndefinedTable: ERROR: los roles de relación no existen

después de perder horas, finalmente descubrí que faltaba la migración ::Migration[5.0].

Migración errónea:

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

Migración fija y correcta

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

Esto podría ser un error con rieles y podría ayudar a alguien, en lugar de luchar y dudar.

Kaleem Ullah
fuente
¡¡¡si!!! No creo que sea un error, aunque es un problema común para rails 5. Creo que rails hizo esto a propósito heredando directamente de ActiveRecord.
Comunidad
2

Recibí un error similar al intentar ejecutar pruebas usando rspec.

Seguí los pasos de Малъ Скрылевъ pero aún así me quedé corto. El último paso que tenía que hacer era cargar mi esquema en mi base de datos de prueba usando:

RAILS_ENV=test rake db:schema:load

Después de eso, el problema desapareció y pude pasar al siguiente error. Con suerte, eso le dará una idea.

Stephen
fuente
2

Elimina la carpeta Admin y vuelve a ejecutar rake.

Roberto Capelo
fuente
2

(Sé que esto es antiguo, pero para futuros usuarios de Google)

¿Usted está utilizando devise? Sé que específicamente omniauthablees un problema, pero quizás otros también. Sin embargo, no tiene por qué serlo devise. Generalmente, la solución es comentar el modelo, la clase, lo que sea, y eliminar los comentarios de las secciones que soliciten los errores.

Para mí, lo que estaba sucediendo es que deviseestá leyendo el Usermodelo para ver lo que tienes como argumentos para devise(el método de clase, es decir devise :database_authenticatable, :registerable #etc)

Pero, leerá todo el archivo y si este no es un proyecto nuevo, podría tropezarse con otros métodos de clase que dependen de otras cosas (en mi caso, era la friendly_idgema, y ​​luego unalias_method

La respuesta fue comentar el Usermodelo a excepción de las deviselíneas * y rake db:schema:loaddebería funcionar bien.

  • de lo contrario, recibí este error:

    ArgumentError: Asignación de omniauth_callbacks en un recurso que no es omnidireccional Agregue devise :omniauthableal Usermodelo

MCB
fuente
2

Si recibe este error durante la migración, asegúrese de que el nombre de su modelo sea plural

p.ej.

add_column :images, :url, :string
stevec
fuente
1

La causa más probable es que su rake esté usando un entorno diferente de database.yml que su servidor web.

techvineet
fuente
Hola, ¿cómo es esto algo de lo que puedo estar seguro? ¿Hay algún comando que pueda poner en la terminal?
Naomi K
y ¿cómo está iniciando su servidor web?
techvineet
Estoy ejecutando localmente en este momento usando rieles en la terminal
Naomi K
1

Tuve este problema y resultó ser causado por la API de Grape . Noté en el seguimiento de la pila que el archivo de rutas se estaba leyendo durante la migración.

En route.rb se monta la API de Grape

mount API::Base => '/'

Y en la API había referencias al modelo que faltaba. Entonces, gracias a esta respuesta lo coloco en un bloque que detecta si está siendo ejecutado por el servidor o durante la migración.

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

Y funcionó.

Julian Mann
fuente
1

Tenía el siguiente error y type_zonesestaba buscando en todo el código de mi aplicación porque no pude encontrarlo. También miré la base de datos y se actualizó.

Resulta que era un archivo debajo de los accesorios lo /test/fixtures/type_zones.ymlque estaba causando el problema.

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"
juliangonzalez
fuente
1

Para cualquiera que todavía tenga este problema, en mi caso, fue mi fábrica en FactoryGirl la que desencadenó este error.

Estaba intentando agregar una referencia a través de '.new' o '.create'.

Mateus Luiz
fuente
0

En mi caso, tuve que comentar 2 ActiveAdmin archivos. Aquí estaban mis pasos:

  1. Error inicial / seguimiento de pila (tenga en cuenta que estamos usando Solren este proyecto): ⇒ 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)

Comenté el app/admin/discussions.rbarchivo según la respuesta de Arcolye anterior e intenté migrar mi base de datos nuevamente.

Mismo error.

Miré el stacktrace un poco más de cerca y noté que, de hecho, app/admin/users.rb:25estaba lanzando la excepción, y efectivamente , ese archivo tiene una dependencia en mi discussionstabla (a través de la ejecuciónDiscussion.all ).

Finalmente, comentar el contenido de users.rbme permitió finalmente migrar mi base de datos con éxito.

FYI: hay una discusión aquí en ActiveAdminacerca de si esa gema debe cargar la base de datos cuando sea necesario.

mecampbellsoup
fuente
0

Estaba captando el error:

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

Resultó ser una solución muy fácil. Había copiado archivos de una versión anterior del proyecto y olvidé anidarlos dentro de una carpeta "migrar". Cuando hice eso, me resolvió el problema.

John Chriest
fuente
0

Por lo general, puede suceder cuando usa un tipo incorrecto de asociación entre modelos, verifique las asociaciones de destrucción de dependencia y has_many, por ejemplo:

camino equivocado que puede causar este problema:

article.rb

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

subcategory.rb

has_and_belongs_to_many :articles

manera correcta:

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)
milaziggy
fuente