Passer de SQLite à PostgreSQL dans un nouveau projet Rails

125

J'ai une application de rails dont les bases de données sont en SQLite (le développement et la production). Depuis que je passe à heroku, je souhaite convertir ma base de données en 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 changer cela, cependant, comment puis-je changer l'environnement de production de SQLite à PostgreSQL?

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

PS 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 ce qu'il faut faire?

Vasseurth
la source
2
Avez-vous des données de production en direct qui doivent l'accompagner, ou s'agit-il d'une nouvelle / nouvelle application?
Dylan Markow
19
Je vous recommande également de changer votre environnement de développement en PostgreSQL. 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.
mu est trop court le

Réponses:

101

Vous pouvez changer votre database.yml en ceci au lieu d'utiliser le 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
Chris Barretto
la source
1
Dois-je mettre project_test ou le nom de ma base de données?
Vasseurth
5
Vous pouvez le nommer comme vous le souhaitez. Si le nom de votre projet est «calculatrice», je les nommerais calculator_production, calculator_test, calculator_development
Chris Barretto
2
@mmichael cela dépend vraiment de la façon dont vous avez configuré vos postgres. L'utilisation de postgres.app, brew ou native si vous êtes sur MacOS X Lion + a des restrictions différentes sur leur configuration par défaut. Donc, si le nom d'utilisateur et le mot de passe ne s'appliquent pas, vous pouvez les laisser de côté ou sans valeur. C'était juste plus un type de configuration «fourre-tout».
Chris Barretto
2
Que fait «& TEST» là-dedans (ligne 9)?
David Rhoden
2
"& TEST" définit TEST comme ensemble d'options par défaut. Ils peuvent ensuite être remplacés ou simplement laissés de côté. "<<: * TEST" est le moyen d'accéder à la valeur par défaut @DavidRhoden
Chris Barretto
44

Les étapes ci-dessous ont fonctionné pour moi. Il utilise le bijou taps , 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 beaucoup 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 d'identifiant d'utilisateur ni de mot de passe, mais le gem taps nécessite quelque chose. J'ai juste utilisé les littéraux «utilisateur» et «mot de passe».

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 - Commande mise à jour ci-dessous - utilisez-la à la place

$ 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émarrez 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émarrez le serveur Web Rails

$ rails s

Nettoyer le Gemfile

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle
ardochhigh
la source
10

Depuis que vous passez à heroku, vous pouvez utiliser des robinets pour le faire:

heroku db:push

Cela poussera vos données sqlite de développement local vers la production, et heroku se convertira automatiquement 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
Jesse Wolgamott
la source
1
le gem taps ne semble pas bien fonctionner avec la 1.9.3, vous devrez peut-être installer la 1.9.2 localement pour le faire fonctionner - une fois que je l'ai fait, c'était incroyablement fluide github.com/ricardochimal/taps/issues/93
sbeam
Ce n'est plus possible. Voir cette question pour plus d'informations: stackoverflow.com/questions/19817851/…
sykaeh
5

vous devrez aussi ajouter la ligne " gem 'pg' " à votre gemfile, 'pg' étant la gemme postgres actuelle pour Rails.

Gus Shortz
la source
5

Mettez simplement à jour le fichier config / database.yml:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  database: projectname_development

test:
  <<: *default
  database: projectname_test

production:
  <<: *default
  database: projectname_production
  username: 
  password: 

Ce qui précède est ce qui est généré lorsque vous exécutez:

$ rails new projectname --database=postgresql --skip-test-unit

Ajoutez également ceci à votre Gemfile:

gem 'pg'
jungledre
la source
5

Maintenant c'est devenu facile avec une seule commande

bin/rails db:system:change --to=postgresql
K ABHIRAM
la source
1
C'est une excellente réponse, cela change le database.yml avec les valeurs nécessaires. Vous pouvez toujours y aller et changer le nom de la base de données en fonction de votre projet.
csalmeida
3

Après avoir remplacé gem 'sqlite3par gem pgdans le gemfile, j'ai continué à obtenir le message sqlite3 erroren poussant vers le maître Heroku car j'avais oublié de valider le gemfile mis à jour. Simplement faire ce qui suit a résolu ceci:

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master
Zorak
la source
3

Mettez simplement à jour votre datatbase.yml

development: &development
  adapter: postgresql
  database: Your_database_name
  username: user_name
  password: password
  host:     localhost
  schema_search_path: public
  min_messages: warning

test:
  <<: *development
  database: test_database_name

production:
  <<: *development
  database: production_db_name

Nous utilisons des rails et les normes de base doivent être suivies comme DRY, Convention over Configuration etc. donc dans le code ci-dessus, nous ne répétons pas le même code encore et encore.

Sunil
la source
2

Cela a été mentionné au-dessus de moi, mais je n'ai pas assez de réputation en tant que rôdeur pour pouvoir voter pour lui. Dans l'espoir d'attirer un peu plus l'attention des débutants de Rails lisant cette réponse:

vous devrez aussi ajouter la ligne "gem 'pg'" à votre gemfile, 'pg' étant la gemme postgres actuelle pour Rails.

^^^ Ceci est un élément clé en plus du fichier database.yml décrit dans la réponse sélectionnée pour migrer votre application Rails vers Postgres.

Justin Houk
la source
1

C'est comme ça que j'ai la configuration de la mienne. Si vous utilisez uniquement l'IRM et non Jruby, vous pouvez ignorer la logique dans les paramètres de l'adaptateur.

defaults: &defaults
  adapter: <%= RUBY_ENGINE == 'ruby' ? 'postgresql' : 'jdbcpostgresql' %>
  encoding: unicode
  pool: 5
  timeout: 5000

development:
  database: project_development
  <<: *defaults

test:
  database: project_test
  <<: *defaults

production:
  database: project_production
  <<: *defaults
ianks
la source
0

Aujourd'hui, j'ai eu le même problème. Je travaille sur Rails 4.2.8. La solution a été spécifier la version gem pg, dans mon cas, 0.18.4.

Benjamin Peña Olvera
la source