web-dev-qa-db-fra.com

Passer de SQLite à PostgreSQL dans un nouveau projet Rails

J'ai une application Rails dont les bases de données sont en SQLite (Le développement et la production). Depuis que je me déplace vers heroku, je veux 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 modifiée depuis SQLite. Je n'ai donc pas besoin de changer cela. Cependant, comment puis-je modifier l'environnement de production de SQLite en PostgreSQL?

Est-ce que quelqu'un a déjà fait cela auparavant et peut 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 ce qu'il faut faire?

120
Vasseurth

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
98
Chris Barretto

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

Notez que SQLite n'a pas d'identifiant d'utilisateur ni de mot de passe, mais la gem taps nécessite quelque chose. Je viens d'utiliser les littéraux "utilisateur" et "mot de passe".

Créez l'utilisateur de 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 plutôt ceci

$ createuser f3 -d -s

Créer 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 de 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
43
ardochhigh

Depuis que vous déménagez à heroku, vous pouvez utiliser les 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 à heroku, mais ce n’est pas testé.

Rails_ENV=production heroku db:Push
9
Jesse Wolgamott

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'
5
jungledre

vous devrez également ajouter la ligne " gem 'pg' " à votre fichier gem, 'pg' étant la gem postgres actuelle pour Rails.

5
Gus Shortz

Après avoir remplacé gem 'sqlite3 par gem pg dans le fichier gem, je continuais à obtenir le sqlite3 error lors de l'envoi au maître Heroku, car j'avais oublié de valider le fichier gem mis à jour. Il a simplement résolu ce qui suit:

git add .
git commit -m 'heroku Push'
heroku create 
git Push heroku master
3
Zorak

Il suffit de vous mettre à jour 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 Rails et les normes de base doivent être les mêmes que celles de DRY, Convention over Configuration, etc., donc dans le code ci-dessus, nous ne répétons pas le même code encore et encore.

3
sunil

Maintenant c'est devenu facile avec la commande

bin/Rails db:system:change --to=postgresql

si vous avez des doutes, vous pouvez vérifier ici

https://github.com/Rails/rails/pull/34832
2
K ABHIRAM

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

vous devrez également ajouter la ligne "gem" pg "à votre fichier gem," pg "étant la gem postgres actuelle pour Rails.

^^^ Il s'agit d'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.

2
Justin Houk

C'est comme ça que j'ai la configuration de la mienne. Si vous utilisez uniquement l'IRM et pas 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
1
ianks

Une solution possible (pas pour heroku) est d'utiliser yaml.db à partir de:

http://www.railslodge.com/plugins/830-yaml-db

0
F.Filippi

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

0

Vous pouvez essayer de suivre: sqlite3 development.db .dump | psql dbname username

ou essayez avec sqlitetopgscript: http://trac-hacks.org/browser/sqlitetopgscript/0.10/sqlite2pg

0
Vibhor Kumar