dans Rails, comment puis-je exécuter du code SQL direct sur une base de données différente?

StackOverflow https://stackoverflow.com/questions/80859

Question

Voici le cas.

J'écris une application Rails qui surveillera la qualité des données sur certaines bases de données spécifiques. Pour ce faire, je dois pouvoir exécuter des requêtes SQL directes sur ces bases de données, lesquelles ne sont bien sûr pas identiques à celle utilisée pour gérer les modèles d'application Rails. En bref, cela signifie que je ne peux pas utiliser l’astuce de passer par la connexion de base ActiveRecord.

Les bases de données auxquelles je dois me connecter ne sont pas connues au moment de la conception (c'est-à-dire: je ne peux pas mettre leurs détails dans database.yaml). Au lieu de cela, j'ai un modèle 'database_details' que l'utilisateur utilisera pour entrer les détails des bases de données sur lesquelles l'application exécutera des requêtes au moment de l'exécution.
Ainsi, la connexion à ces bases de données est réellement dynamique et les détails sont résolus au moment de l'exécution seulement.

Comment puis-je faire cela?

Merci,
Rollo

Était-ce utile?

La solution

Dans une situation comme celle-ci, je devais me connecter à des centaines d'instances différentes d'une application externe et créer un code similaire à celui-ci:

  def get_custom_connection(identifier, host, port, dbname, dbuser, password)
      eval("Custom_#{identifier} = Class::new(ActiveRecord::Base)")
      eval("Custom_#{identifier}.establish_connection(:adapter=>'mysql', :host=>'#{host}', :port=>#{port}, :database=>'#{dbname}', " +
      ":username=>'#{dbuser}', :password=>'#{password}')")  
    return eval("Custom_#{identifier}.connection")
  end

Cela présente l’avantage supplémentaire de ne pas modifier la connexion ActiveRecord :: Base dont vos modèles ont hérité. Vous pouvez donc exécuter SQL sur cette connexion et ignorer l’objet lorsque vous avez terminé.

Autres conseils

Vous pouvez établir une connexion par programme en utilisant un appel comme celui-ci

ActiveRecord::Base.establish_connection(
   :adapter  => "mysql",
   :host     => "localhost",
   :username => "myuser",
   :password => "mypass",
   :database => "somedatabase"
)

Comme vous le voyez, vous pouvez remplacer la somedatabase par une valeur database_model.database_name. même avec l'adatpter et tous

ActiveRecord :: Base.establish_connection documentation

Ensuite, vous pouvez utiliser

ActiveRecord::Base.find_by_sql("select * ") 

pour exécuter votre requête SQL.

ActiveRecord :: Base.find_by_sql documentation

M. Matt avait raison s'il était incomplet

Plus d'informations (périmées mais utiles pour la conception) peuvent être trouvées ici et rappelez-vous de vous reconnecter à la base de données normale lorsque vous avez terminé:)

Vous pouvez le faire via self.establish_connection

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top