126 votes

Passer de SQLite à PostgreSQL dans un nouveau projet Rails

J'ai une application rails dont les bases de données sont en SQLite (le dev et la production). Depuis que je passe à heroku, je veux convertir ma base de données à PostgreSQL.

Quoi qu'il en soit, j'ai entendu dire que la base de données locale, de développement, n'a pas besoin d'être changée de SQLite, donc je n'ai pas besoin de la changer. Cependant, comment dois-je procéder pour changer l'environnement de production de SQLite à PostgreSQL ?

Quelqu'un a-t-il déjà fait cela et peut-il m'aider ?

P.S. Je ne sais pas exactement comment s'appelle ce processus, mais j'ai entendu parler de la migration de la base de données de SQLite vers PostgreSQL, est-ce que c'est ce qu'il faut faire ?

2 votes

Avez-vous des données de production en direct qui doivent aller avec, ou s'agit-il d'une nouvelle application ?

19 votes

Je vous recommande de changer votre environnement de développement pour PostgreSQL également. SQLite et PostgreSQL (et toutes les autres bases de données) ont des idées différentes sur ce que signifie "SQL valide" et aucun ORM ne peut vous isoler de toutes les idiosyncrasies de la base de données.

102voto

Chris Barretto Points 3934

Vous pouvez modifier votre fichier database.yml en ce sens au lieu d'utiliser le fichier sqlite prêt à l'emploi :

development:
  adapter: postgresql
  encoding: utf8
  database: project_development
  pool: 5
  username: 
  password:

test: &TEST
  adapter: postgresql
  encoding: utf8
  database: project_test
  pool: 5
  username: 
  password:

production:
  adapter: postgresql
  encoding: utf8
  database: project_production
  pool: 5
  username: 
  password:

cucumber:
  <<: *TEST

1 votes

Dois-je mettre project_test ou le nom de ma base de données ?

5 votes

Tu peux l'appeler comme tu veux. Si le nom de votre projet est "calculatrice", je les nommerais calculatrice_production, calculatrice_test et calculatrice_développement.

1 votes

Je suis curieux, avez-vous vraiment besoin de la username y password pour configurer PG ? Je n'ai utilisé que adapter , database y host dans mes applications Rails depuis que j'ai abandonné SQLite3. Y a-t-il un avantage (par exemple pour la sécurité) à ajouter le nom d'utilisateur et le mot de passe ?

43voto

ardochhigh Points 1221

Les étapes ci-dessous ont fonctionné pour moi. Elle utilise le robinets créé par Heroku et mentionné dans le Railscast #342 de Ryan Bates. Il y a quelques étapes mais cela a parfaitement fonctionné (même les dates ont été correctement migrées), et c'était bien plus facile que les migrations Oracle -> DB2 ou SQL Server -> Oracle que j'ai effectuées dans le passé.

Notez que SQLite n'a pas de nom d'utilisateur ou de mot de passe, mais la gemme taps exige quelque chose. J'ai juste utilisé les littéraux "user" et "password".

Créer l'utilisateur de la base de données Postgres pour les nouvelles bases de données

$ createuser f3
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y

EDIT - Mise à jour de la commande ci-dessous - utilisez plutôt ceci

$ createuser f3 -d -s

Créez les bases de données requises

$ createdb -Of3 -Eutf8 f3_development
$ createdb -Of3 -Eutf8 f3_test

Mettre à jour le Gemfile

gem 'sqlite3'
gem 'pg'
gem 'taps'
$ bundle

Mettre à jour database.yml

#development:
#  adapter: sqlite3
#  database: db/development.sqlite3
#  pool: 5
#  timeout: 5000

development:
  adapter: postgresql
  encoding: unicode
  database: f3_development
  pool: 5
  username: f3
  password:

#test:
#  adapter: sqlite3
#  database: db/test.sqlite3
#  pool: 5
#  timeout: 5000

test:
  adapter: postgresql
  encoding: unicode
  database: f3_test
  pool: 5
  username: f3
  password:

Démarrer le serveur taps sur la base de données sqlite

$ taps server sqlite://db/development.sqlite3 user password

Migrer les données

$ taps pull postgres://f3@localhost/f3_development http://user:password@localhost:5000

Redémarrer le serveur web Rails

$ rails s

Nettoyer le fichier Gemfile

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle

10voto

Jesse Wolgamott Points 30552

Puisque vous passez à heroku, vous pouvez utiliser les taps pour le faire :

heroku db:push

Cela va pousser vos données sqlite de développement local vers la production, et heroku va automatiquement convertir en postgres pour vous.

Cela devrait également fonctionner pour pousser une base de données sqlite de production vers heroku, mais ce n'est pas testé.

RAILS_ENV=production heroku db:push

1 votes

La gemme taps ne semble pas fonctionner correctement avec la version 1.9.3, vous devrez peut-être installer la version 1.9.2 en local pour la faire fonctionner - une fois que c'est fait, elle est incroyablement fluide. github.com/ricardochimal/taps/issues/93

0 votes

Ce n'est plus possible. Voir cette question pour plus d'informations : stackoverflow.com/questions/19817851/

5voto

Gus Shortz Points 411

Vous devrez également ajouter la ligne " gemme 'pg " à votre fichier de gemmes, 'pg' étant la gemme postgres actuelle pour Rails.

3voto

Brian Rollins Points 48

'sqlite3 avec pierre précieuse pg dans le gemfile, je continuais à obtenir le message sqlite3 error lors de la poussée vers Heroku master parce que j'ai oublié de commiter la mise à jour du gemfile. Il suffit de faire ce qui suit pour résoudre le problème :

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master

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