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?
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
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
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
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'
vous devrez également ajouter la ligne " gem 'pg' " à votre fichier gem, 'pg' étant la gem postgres actuelle pour Rails.
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
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.
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
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.
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
Une solution possible (pas pour heroku) est d'utiliser yaml.db à partir de:
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
.
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