Je vois cette question avant, mais seulement pour rspec. Je ne suis pas encore en train de créer un test, car c’est trop avancé pour moi, mais bientôt je le ferai! : P
Je reçois cette erreur lorsque j'essaie de m'inscrire/de me connecter avec mon application. Je ne sais pas où chercher pour le réparer. Je me suis servi de la fonction de conception pour créer mon utilisateur et de omniauth2 pour me connecter avec google.
c'est l'erreur
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
J'ai essayé rake db:migrate
, mais il est déjà créé, les utilisateurs de la table de schéma existent. Quelqu'un at-il eu cette erreur avant?
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:
Je vous remercie!
Au début, vous devez détacher toutes les connexions de la base de données. Par défaut, vous utilisez l'environnement développement. Puis essayez de réinitialiser la base de données avec les éléments suivants:
rake db:reset
La tâche rake db: reset va supprimer la base de données et la configurer à nouveau. Ceci est fonctionnellement équivalent à rake db: drop db: setup.
Ce n'est pas la même chose que d'exécuter toutes les migrations. Il utilisera uniquement le contenu du fichier schema.rb actuel. Si une migration ne peut pas être annulée, rake db: reset peut ne pas vous aider. Pour en savoir plus sur le vidage du schéma, voir Schéma Dumping et vous section. Rails Docs
Si l'astuce ne vous aide pas, supprimez la base de données, puis recréez-la à nouveau, migrez les données et, si vous avez des graines, semez la base de données:
rake db:drop db:create db:migrate db:seed
ou à court terme (depuis 3.2):
rake db:migrate:reset db:seed
Puisque db:migrate:reset
implique la suppression, la création et la migration de la base de données. Étant donné que l'environnement par défaut pour rake
est développement, si vous voyez l'exception dans les tests de spécification, vous devez recréer la base de données pour l'environnement test comme suit:
Rails_ENV=test rake db:drop db:create db:migrate
ou juste en chargeant le schéma migré:
Rails_ENV=test rake db:drop db:create db:schema:load
Dans la plupart des cas, la base de données de test est semée au cours des procédures de test. Il n'est donc pas nécessaire que l'action de tâche db:seed
soit transmise. Sinon, vous devez préparer la base de données (ceci est déconseillé dans Rails 4):
rake db:test:prepare
et ensuite (si nécessaire):
Rails_ENV=test rake db:seed
Sur les versions plus récentes de Rails, l'erreur ActiveRecord :: NoEnvironmentInSchemaError peut être générée, il est donc préférable de préfixer les tâches avec une tâche d'ensemble d'environnement de base de données: db: environment: set
Rails_ENV=test rake db:environment:set db:drop db:create db:migrate
Votre base de données de test n'est pas prête pour rspec.
Préparez votre base de données de test pour que rspec corrige cette erreur
Rails_ENV=test rake test:prepare
Il va déposer, créer et ajouter des migrations à votre base de test
Dans le cas où la tâche rake est abandonnée avec le message 'PG :: Error: ERROR: la base de données "[your_db_test]" est utilisée par d'autres utilisateurs
Rails_ENV=test rake db:migrate
Je rencontre cette erreur et sur ma recherche une des raisons pour PG utilisateurs de relation d'erreur indéterminée n'existe pas erreur est
Cette erreur est une erreur de migration. Vous avez peut-être créé un nouveau modèle avec certains attributs de base de données. Après avoir créé le modèle, vous devez migrer les attributs vers le schéma de votre application Rails.
Si vous utilisez une machine locale pour le développement, vous pouvez utiliser la commande
rake db:migrate
Si vous utilisez heroku
heroku run rake db:migrate
J'ai eu une erreur similaire. La racine de mon erreur est que j'ai eu une référence à un modèle Rails dans mon fichier factories.rb. Cela a donc provoqué une erreur de chargement. Le correctif consistait à envelopper la référence dans un bloc ou {}
afin de retarder son exécution.
Voici le code BROKEN:
FactoryGirl.define do
factory :user do
guid User.new.send(:new_token)
end
end
Et c'était une erreur, car User
n'était pas défini lors du chargement de factories.rb. J'ai encapsulé l'appel User.new
dans un bloc et le problème a été résolu:
Code fixe:
FactoryGirl.define do
factory :user do
guid { User.new.send(:new_token) }
end
end
Remarque: Il n'est probablement pas recommandé de faire appel à votre modèle de cette manière, mais il s'agissait d'une solution pour DRY mon code.
Je recevais aussi cette erreur lors de l'exécution de 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
...
Il a été résolu pour moi après avoir couru
rake db:test:prepare
rake db:test:load
Ceci est souvent causé par un bogue dans ActiveAdmin. Voici comment contourner le bug:
Si vous utilisez ActiveAdmin, quelle que soit la table indiquée par PG, commentez le contenu de ce fichier rb ActiveAdmin.
Par exemple, dans ce cas, PGError: ERROR: relation "users" does not exist
, commentez l'intégralité du contenu de app/admin/users.rb
, puis supprimez la mise en commentaire une fois vos migrations effectuées.
Ce problème pour moi était causé par Factory Girl Rails. Je recommanderais à ceux qui l'utilisent de renommer le dossier specs/factories en specs/temp et d'essayer
Rails_ENV = votre ensemble environnement exec rake db: migrate --trace
Si cela passe, alors vous venez de trouver ce qui le causait. Un coup d'œil rapide dans le gem github repo de Factory Girl Rails m'a aidé à identifier le problème.
Les usines échouaient parce que j'essayais d'instancier un modèle qui n'existait pas à l'exécution! Exemple de code ci-dessous:
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
Encapsuler le tableau dans un bloc (en ajoutant {}) a résolu le problème pour moi. Notez que payment_options peut prendre plusieurs options de paiement dans l'exemple ...
payment_options {[Billing::PaymentOption.new(term: 1, payment_term: 1)]}
Reportez-vous à la partie Attributs dynamiques des documents Factory Girl Rails pour plus d'informations.
N'oubliez pas de renommer votre dossier usines!
::Migration[5.0]
manquait dans les migrations . au lieu de lancer erreur de syntaxe il lève
PG :: UndefinedTable: ERROR: les rôles de relation n'existent pas
après avoir perdu des heures, j'ai finalement compris que la migration manquait::Migration[5.0]
.
Migration erronée:
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
Migration fixe et correcte
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
Cela pourrait être un problème avec Rails et pourrait aider quelqu'un au lieu de se débattre et de se poser des questions.
J'ai eu ce problème après avoir supprimé la table des utilisateurs. les solutions changeaient
change_table(:users)
à
create_table(:users)
Je faisais face au même problème et j’ai découvert la solution suivante.
Assurez-vous que vous avez entré toutes les informations d'identification suivantes dans le fichier database.yml et qu'elles sont correctes:
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
J'obtenais une erreur similaire en essayant d'exécuter des tests avec rspec.
J'ai suivi les pas de Малъ Скрылевъ mais j'ai quand même fini court. La dernière étape que je devais faire était de charger mon schéma dans ma base de données de test en utilisant:
Rails_ENV=test rake db:schema:load
Après cela, le problème est parti et je pouvais passer au bogue suivant. Espérons que cela vous donne un aperçu.
Supprimez le dossier Admin et exécutez à nouveau rake.
(Je sais que c'est vieux, mais pour les futurs googlers)
Utilisez-vous devise
? Je sais que spécifiquement omniauthable
est un problème, mais peut-être d’autres aussi. Cela ne doit pas nécessairement être devise
. Généralement, la solution consiste à commenter le modèle, la classe, tout ce qui ne va pas, et à ne pas commenter les sections demandées par les erreurs.
Pour moi, ce qui se passait, c'est que devise
lit le modèle User
pour voir ce que vous avez comme arguments pour devise
(la méthode de classe C'est-à-dire. devise :database_authenticatable, :registerable #etc
).
Mais, il lira l’ensemble du fichier et si ce n’est pas un nouveau projet, il risque d’être déclenché par d’autres méthodes de classe reposant sur d’autres éléments (dans mon cas, c’était le friendly_id
gem, puis un alias_method
La réponse a été de commenter le modèle User
à l'exception des devise
lignes (s) * et rake db:schema:load
devraient fonctionner correctement.
sinon j'ai cette erreur:
ArgumentError: Mappage omniauth_callbacks sur une ressource qui n'est pas omniauthable Veuillez ajouter devise :omniauthable
au modèle User
.
La cause la plus probable est que votre rake utilise un environnement différent de database.yml et de votre serveur Web.
J'ai eu ce problème et il s'est avéré être causé par API de raisin . J'ai remarqué dans la trace de la pile que le fichier de routes était en cours de lecture pendant la migration.
Dans routes.rb, l'api Grape est monté
mount API::Base => '/'
Et dans l'API, il y avait des références au modèle manquant. Donc, grâce à cette réponse je l’ai mise dans un bloc qui détecte si elle est exécutée par le serveur ou pendant la migration.
unless ( File.basename($0) == "rake" && ARGV.include?("db:migrate") )
mount API::Base => '/'
end
Et ça a fonctionné.
Donc, avoir le même problème tout à l'heure. N'oubliez pas d'avoir un seul modèle dans chaque migration. Cela l'a résolu pour moi.
Si vous obtenez cette erreur lors de la migration, assurez-vous que votre nom de modèle est au pluriel.
par exemple.
add_column :images, :url, :string
Dans mon cas, je devais commenter 2ActiveAdmin
fichiers. Voici mes pas:
Solr
sur ce projet):
⇒ 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/empileurs/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/constructeurs de pile/AchieveX/config/environment.rb: 5: dans `' Tâches: TOP => db: migrate => environment (Voir la trace complète en exécutant la tâche avec --trace) </ code>
J'ai commenté le fichier app/admin/discussions.rb
conformément à la réponse d'Arcolye ci-dessus et j'ai essayé de migrer à nouveau ma base de données.
Même erreur.
J'ai regardé la pile de plus près et j'ai remarqué qu'en fait, app/admin/users.rb:25
lançait l'exception - et ce fichier a une dépendance sur ma table discussions
(via l'exécution de Discussion.all
).
Enfin, commenter le contenu de users.rb
m'a permis de migrer enfin ma base de données avec succès.
Pour votre information: il y a une discussion ici dans ActiveAdmin
sur le point de savoir si cette gemme devrait charger la base de données si nécessaire.
Pour ceux qui ont encore ce problème, mon usine de FactoryGirl était à l’origine de cette erreur.
J'essayais d'ajouter une référence via ".new" ou ".create".
J'attrapais l'erreur:
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "users" does not exist
LINE 8: WHERE a.attrelid = '"users"'::regclass
Cela s'est avéré être une solution super facile. J'avais copié des fichiers d'une ancienne version du projet et j'avais oublié de les imbriquer dans un dossier "migrate". Quand j'ai fait ça, ça a résolu le problème pour moi.
J'avais l'erreur suivante et fais une recherche dans tout mon code d'application pour type_zones
Je n'ai pas pu le trouver. J'ai aussi regardé la base de données et il a été mis à jour.
Il s'avère que c'était un fichier sous fixtures /test/fixtures/type_zones.yml
qui causait le problème.
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"