52 votes

Comment importer un fichier SQL dans une base de données Rails ?

J'ai un .sql que j'aimerais charger dans ma base de données Rails à l'aide d'une tâche Rake. Comment puis-je faire cela ?

57voto

Abel Points 2430

Le moyen le plus simple :

bundle exec rails db < $SQL_FILE

exemple :

bundle exec rails db < my_db.sql

1 votes

Comment ajouter ceci à une tâche Rake ?

2 votes

Avec des rails 5+. rails db < my_sql.sql fonctionnerait aussi bien

0 votes

Est-il possible de définir le mot de passe comme paramètre pour cette tâche ?

47voto

Nathan Long Points 30303

La méthode simple

Cela fonctionne pour les cas simples.

ActiveRecord::Base.connection.execute(IO.read("path/to/file"))

Solution trouvée sur le site Liste de diffusion Ruby On Rails datant de 2006 (mais qui fonctionne toujours en 2011 sur Rails 3.1).

Notes de bas de page

  • Cette question connexe a sous-entendu cette solution, mais l'a rejetée pour les grandes importations. Je voulais la montrer explicitement, puisqu'elle fonctionne pour les petites importations.
  • Le fichier que j'essayais d'importer contenait un LOCK TABLES suivi d'un insert. Les données étaient destinées à une base de données MySQL. Mysql2 disait qu'il y avait une erreur de syntaxe SQL invalide jusqu'à ce que je supprime les instructions de verrouillage et de déverrouillage.

16voto

joost Points 861

Sur MySQL, cela m'a donné une erreur de syntaxe. En divisant le code SQL en déclarations, cela a fonctionné.

sql = File.read(sql_file)
statements = sql.split(/;$/)
statements.pop # remove empty line
ActiveRecord::Base.transaction do
  statements.each do |statement|
    connection.execute(statement)
  end
end

0 votes

Je reçois ActiveRecord::StatementInvalid: PG::UnableToSend: another command is already in progress

1 votes

Ma réponse concernait MySQL et non Postgres. Il semble que vous ayez plusieurs processus accédant à votre base de données.

0 votes

Si vous oubliez le ';' à la fin de votre requête SQL, le programme statements.pop # remote empty line supprimera votre dernière requête. Vous pouvez utiliser ce qui suit pour éviter cela, statements.pop if statements[-1] =~ /^\s+$/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X