web-dev-qa-db-fra.com

comment exécuter un script .sql sur heroku?

J'ai un fichier .sql avec un tas de commandes d'insertion que je veux exécuter sur ma base de données postgres sur heroku. Mais je ne sais pas comment faire: -

Si j'avais accès à la console postgres, je taperais ce qui suit:

psql -h localhost -d database -U username -f datafile.sql

mais il semble que heroku ne supporte pas cette commande. J'ai essayé avec

heroku pg:psql

mais cela ne me permet pas d'entrer un fichier.

Il y a-t-il des alternatives?

59
Byron Singh

Pour des choses comme l'amorçage d'une base de données, je recommande la réponse de Richard Brown: il vaut sans doute mieux utiliser quelque chose comme Rails mécanisme de graines, ou quelque chose de scripté comme une tâche de râteau.

Cela dit, être capable de diriger SQL (brut ou un fichier) est une fonctionnalité utile, en particulier pour les choses idempotentes comme les simples recherches ou les requêtes de routine. Dans ce cas, vous pouvez exécuter votre sql local avec l'un des éléments suivants:

$ cat file.sql | heroku pg:psql --app app_name
$ echo "select * from table;" | heroku pg:psql --app app_name
$ heroku pg:psql --app app_name < file.sql
108
catsby

Pourquoi ne pas simplement utiliser psql?

Si vous regardez la sortie de heroku config vous verrez les URL de base de données (clé DATABASE_URL) que votre application utilise - si vous prenez ceci et les séparez en les bons bits pour les utiliser avec psql tout ira bien.

par exemple

DATABASE_URL:  postgres://username:password@Host:port/dbname

devient

psql -h Host -p port -d dbname -U username -f datafile.sql
19
John Beynon

J'aime les mises à jour testables et répétables. Lorsque j'ai besoin de mettre à jour la base de données, j'écris une tâche de râteau pour effectuer la mise à jour; De cette façon, vous pouvez d'abord l'exécuter contre test pour garantir que la sortie est correcte avant de l'exécuter en production.

Vous ne mentionnez pas s'il s'agit d'un chargement de base de données initial ou d'une exécution ultérieure, mais la convention pour charger de nouvelles données dans une base de données Rails consiste à créer un db:seed fichier rake que vous pouvez exécuter après votre db:migrate la tâche est terminée.

Voir: http://justinfrench.com/notebook/a-custom-rake-task-to-reset-and-seed-your-database Et: http: // railscasts. com/episodes/179-seed-data

3
Richard Brown