web-dev-qa-db-fra.com

la configuration de la base de données ne spécifie pas d'adaptateur

Je reçois cette erreur lorsque j'essaie de me connecter à une base de données mysql. Le problème est que l'application fonctionne pendant des semaines, puis je reçois ce message au hasard. Lorsque je reçois ce message d'erreur, l'application n'est pas en mesure de se reconnecter à la base de données tant que je ne la redémarre pas.

J'utilise un fichier de configuration pour me connecter à la base de données, et l'adaptateur est spécifié ... la configuration de la base de données n'est pas générée au moment de l'exécution.

Avez-vous une idée de ce qui se passe?

60
Roberto

quand j'ai essayé d'exécuter un script en ligne de commande (disons 'mon_script' ici), la même erreur s'est produite. Les raisons étaient:

  1. Il n'y a qu'un environnement de production là-bas.
  2. J'ai manqué de définir Rails_ENV pour la ligne de commande.

Donc, voici la solution dans mon cas:

$ Rails_ENV = production mon_script

67
Fumisky Wells

Je viens d'avoir ce problème, et il a été causé par une faute de frappe dans mon configration.yml.

J'avais à l'origine ceci:

production:
  adapter:mysql

Quand je voulais avoir ceci:

production:
  adapter: mysql

Ce petit espace entre adapter: et mysql fait la différence.

35
djacobs7

Une autre cause possible:

Dans Rails 3.2.x, establish_connection a un argument par défaut défini à partir de l'environnement:

De connection_specification.rb :

def self.establish_connection(spec = ENV["DATABASE_URL"])
  resolver = ConnectionSpecification::Resolver.new spec, configurations
  spec = resolver.spec

Le fonctionnement de ConnectionSpecification::Resolver dépend du ENV['DATABASE_URL'] qui donne une nil si elle n’est pas définie. (Normalement, ce serait quelque chose comme 'postgres://...').

Donc, si vous avez mal configuré DATABASE_URL tel que ENV['DATABASE_URL'] == '', cela vous donnera database configuration does not specify adapter.

11
Benjamin Oakes

J'ai eu cette erreur quand j'ai démarré par erreur le serveur Rails avec

Sudo Rails s -e "Production" -p 80

et j'aurais dû commencer Rails avec

Sudo Rails s -e "production" -p 80

7
andrew

Pour moi, cette commande a résolu le problème.

rake db: migrate Rails_ENV = production

4
SenG

J'ai trouvé une autre chose qui peut causer ce problème: "mélanger" un autre noeud YAML en utilisant & et *.

À l'origine, je faisais quelque chose comme ceci pour faciliter les fichiers de configuration locaux, non développés, ignorés par Git:

http://blog.lathi.net/articles/2006/03/02/config-database-yml-goodness-for-teams

Mais, après un certain débogage, j'ai découvert que establish_connection était appelé pour une raison quelconque avec uniquement les paires clé-valeur mélangées et non les paires principales. C'est à dire. adapter, Host, et database n'étaient pas transmis. Je ne sais pas pourquoi, et cela fonctionnait pour moi auparavant.

Quoi qu'il en soit, au lieu de mixer dans un autre nœud YAML, je mets maintenant les hachages development et test entiers dans le fichier de configuration local, et establish_connection est à nouveau appelé correctement.

4
rlkw1024

J'ai eu la même erreur en tapant la commande suivante:

db:migrate Rails_ENV=product

Aurait dû être:

db:migrate Rails_ENV=production
3
Eternal21

J'ai trouvé quelques indices que cela pourrait être lié à une ancienne bibliothèque (ActiveRecord) ou à des versions de gem. Par exemple, problèmes avec les appareils même si le reste de l'application semble correct (après une mise à niveau) ou ce ticket de traçage , qui "empêche les gemmes de requérir un adaptateur d'un ancien gem Active Record". Tous les deux sont vieux, cependant, mais il pourrait être intéressant de s'assurer que vos pierres précieuses sont à jour (si possible).

Utilisez-vous l'adaptateur Rails MySQL natif par hasard? Ceci est maintenant déconseillé sous Rails, mais il est concevable qu'il continue à boiter.

J'ai aussi jeté un coup d'œil rapide à connection_specification.rb, d'où provient cette erreur, et la meilleure hypothèse est qu'un reconnexion échoue ... mais pourquoi (puisqu'il était évident que vous avez démarré l'application pour la première fois) ? Faites-vous quelque chose de sauvage comme appeler ActiveRecord::Base.establish_connection dans votre contrôleur d'application (ou ailleurs)? 

Ou peut-être quelque chose comme: le script runner est appelé par cron en pleine nuit lorsque la connexion est interrompue. Malheureusement, le coureur est appelé avec un Rails_ENV incorrect. Ainsi, la mauvaise strophe est lue à partir de database.yml et cette strophe contient un adapter: invalide?

3
Martin Carpenter

N'oubliez pas que Rails_ENV = staging recherchera une spécification d'activation dans votre database.yml, tout comme définir Rails_ENV = Production recherchera une spécification de production dans le fichier database.yml. 

Fournissez les configurations de base de données, comme indiqué ci-dessous, pour chaque environnement Rails que vous ciblez, par exemple 

bundle exec cap staging deploy

production:
  adapter: mysql2
  encoding: utf8
  database: Rails
  username: Rails
  password: pass
  Host: 127.0.0.1
  port: 3306
  pool: 5
  timeout: 5000

staging:
  adapter: mysql2
  encoding: utf8
  database: Rails
  username: Rails
  password: pass
  Host: 127.0.0.1
  port: 3306
  pool: 5
  timeout: 5000
2
Jones Agyemang

Si vous obtenez cette erreur lors du déploiement avec Capistrano. Assurez-vous que vous définissez le bon Rails_ENV via 

set :Rails_env, 'production'

Par exemple, je ne définissais pas explicitement l'environnement Rails pour la configuration du déploiement de la mise en place de Capistrano. Et ainsi Capistrano a utilisé 'staging' comme Rails_ENV, ce qui a entraîné l'erreur ci-dessus. Le réglage en production comme dans le fichier staging.rb ci-dessus a résolu le problème. 

2
thekindofme

J'ai rencontré ce problème en raison du «problème de support de plusieurs bases de données». Dans mon dossier app/model, un fichier définit une connexion de base de données redondante: 

class CacheCleanerActiveRecord < ActiveRecord::Base
  establish_connection "cache_cleaner_#{Rails.env}"
  self.abstract_class = true
end

mais cette base de données ne se trouve pas dans mon database.yml (car elle n'est pas utilisée du tout). 

la solution est simple: supprimez ce fichier et tout va bien! 

1

Nous avons eu ce problème avec l'une de nos anciennes applications. Quelqu'un avait créé un environnement de boutique nommé. Même si RAIL_ENV était défini sur la production, il recherchait une configuration de base de données appelée legacy_<RAIL_ENV>. Je devais donc créer un environnement de base de données appelé legacy_production pour que cette application fonctionne.

Si vous maintenez l'application de quelqu'un d'autre, je chercherais une copie du database.yml de cette application qui fonctionne, elle contient peut-être une configuration étrangement nommée. Vous pouvez rechercher establish_connection dans votre base de code pour voir s’il définit une variante étrange.

1
Peter Dietz

N'oubliez pas d'utiliser la gemme Ruby basée sur C pour mysql. Le Ruby est instable pour la production.

Essayez d'installer la gemme

gem install mysql

N'oubliez pas de copier libmySQL.dll dans le répertoire Ruby bin.

1
Ricardo Acras

Vous pouvez avoir une erreur comme:

Rails_ENV= test

Un espace après le signe égal n'est pas autorisé, remplacez-le par:

Rails_ENV=test
1
David tsang

J'ai eu cette erreur avec un autre problème; J'avais spécifié «développement» deux fois et «test» pas du tout.

1
Karen

Il y a beaucoup de mauvais tutoriels sur Internet qui montrent les fichiers yaml comme ceci:

development:
encoding: utf
database: dbname
...etc

Les fichiers YAML sont sensibles à la casse et nécessitent deux espaces pour le contenu interne de chaque attribut de type base de données. Ainsi:

development:
  encoding: utf
  database: dbname
  ...etc

UPDATE: J'ai eu cette erreurencoreaujourd'hui. Mon serveur VPS avait installé Rails 3.2.8 lorsque mon application exécutait Rails 3.2.6.

Vérifiez définitivement votre Gemfile et votre fichier database.yml (bien sûr). Le problème ici est clairement énoncé - Rails ne communique pas avec votre base de données spécifiquement à cause d'un adaptateur (gem)

1
boulder_ruby

Vous devez spécifier l'environnement lors de l'exécution du serveur ou de la commande, car votre fichier database.yml peut contenir uniquement un adaptateur de production, alors que l'exécution de la commande dake: migrate, par exemple, prend la variable d'environnement comme développement. 

0
Asim Mushtaq

Cela m’arrive enfin, j’ai trouvé que Rails_ENV est sensible à la casse. Dans mon environnement, j’ai mis Rails_ENV=DEVELOPMENT, qui est faux, la valeur de Rails_ENV doit être minuscule .

$ Rails_ENV=DEVELOPMENT Rails server webrick
=> Booting WEBrick
=> Rails 4.2.5 application starting in DEVELOPMENT on http://localhost:3000
=> Run `Rails server -h` for more startup options
=> Ctrl-C to shutdown server
config.eager_load is set to nil. Please update your config/environments/*.rb files accordingly:

  * development - set it to false
  * test - set it to false (unless you use a tool that preloads your test environment)
  * production - set it to true

Exiting
/home/fangxing/.rvm/gems/Ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/connection_specification.rb:248:in `resolve_symbol_c
onnection': 'DEVELOPMENT' database is not configured. Available: ["default", "development", "test", "production"] (ActiveRecord::AdapterNotSpecified)
        from /home/fangxing/.rvm/gems/Ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/connection_specification.rb:211:in `res
olve_connection'



$ Rails_ENV=development Rails server webrick
RubyDep: WARNING: Your Ruby is outdated/buggy. (To disable warnings, set Ruby_DEP_GEM_SILENCE_WARNINGS=1)
RubyDep: WARNING: Your Ruby is: 2.3.0 (buggy). Recommendation: install 2.3.1.
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://localhost:3000
=> Run `Rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-07-20 16:41:09] INFO  WEBrick 1.3.1
[2016-07-20 16:41:09] INFO  Ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-07-20 16:41:09] INFO  WEBrick::HTTPServer#start: pid=19881 port=3000
0
fangxing

appelez rake assets:precompile:all

0
grosser

Par souci d’exhaustivité, je viens de recevoir cette erreur, car j’ai créé de manière native un script de runner paramétré prenant une adresse e-mail et nommé l’option de ligne de commande -e - qui est bien sûr celle utilisée par le runner Rails pour l’environnement. Donc, il essayait de trouver une configuration d'environnement qui correspond à l'adresse email!

Heureusement, juste avant l'erreur ActiveRecord mentionnée dans le titre, cela m'a donné un message d'erreur qui m'a aidé à comprendre le problème:

You did not specify how you would like Rails to report deprecation notices for your [email protected] environment, please set config.active_support.deprecation to :log, :notify or :stderr at config/environments/[email protected]
0
Emma Burrows

Ce n'est probablement pas le problème le plus susceptible de causer cette erreur, mais ici, c'est juste au cas où.

Mon problème était que je construisais les paramètres de base de données dans Hash en utilisant des symboles comme clés, puis en le sérialisant avec #to_yaml à database.yaml. ActiveRecord s'attend à ce que les noms d'environnement soient Strings, et non Symbols, de sorte que les paramètres de la base de données n'ont pas été pris en compte lors de la lecture du fichier généré. Je l'ai corrigé en utilisant des clés de chaîne dans le hachage.

0
Jenner LaFave

Rails -e "production" est correct

seul Rails -e production renvoie une erreur

database configuration does not specify adapter (ActiveRecord::AdapterNotSpecified)
0
Muflix

Pour Rails4, commenter la ligne fetch(:default_env).merge!(Rails_env: 'production') dans production.rb et ajouter set :Rails_env, :production l'a corrigée.

0
Pratik Khadloya