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?
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:
Donc, voici la solution dans mon cas:
$ Rails_ENV = production mon_script
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.
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
.
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
Pour moi, cette commande a résolu le problème.
rake db: migrate Rails_ENV = production
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.
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
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?
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
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.
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!
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.
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.
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
J'ai eu cette erreur avec un autre problème; J'avais spécifié «développement» deux fois et «test» pas du tout.
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)
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.
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
appelez rake assets:precompile:all
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]
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.
Rails -e "production"
est correct
seul Rails -e production
renvoie une erreur
database configuration does not specify adapter (ActiveRecord::AdapterNotSpecified)
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.