У меня есть приложение rails, что базы данных находятся в SQLite (Dev и production). Поскольку я перехожу к heroku, я хочу преобразовать свою базу данных в PostgreSQL.
В любом случае, я слышал, что локальная база разработки не нуждается в изменении от SQLite, поэтому мне не нужно ее менять, однако, как мне пойти по поводу изменения производственной среды от SQLite до PostgreSQL?
Кто-нибудь когда-либо делал это раньше и может помочь?
P.S. Я не уверен, что именно этот процесс называется, но я слышал о переходе базы данных из SQLite на PostgreSQL, это то, что нужно сделать?
Вы можете изменить свой database.yml на это вместо использования sqlite из коробки:
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
Следующие шаги работали для меня. Он использует драгоценный камень кранов, созданный Heroku и упомянутый в Ryan Bates Railscast # 342. Есть несколько шагов, но он работал отлично (даже даты были правильно перенесены), и это было намного проще, чем Oracle- > DB2 или SQL Server → миграции Oracle, которые я делал в прошлом.
Обратите внимание, что SQLite не имеет идентификатора пользователя или пароля, но метка драгоценных камней требует чего-то. Я просто использовал литералы "пользователь" и "пароль".
Создать пользователя базы данных Postgres для новых баз данных
$ 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 - обновленная команда ниже - используйте это вместо
$ createuser f3 -d -s
Создать необходимые базы данных
$ createdb -Of3 -Eutf8 f3_development
$ createdb -Of3 -Eutf8 f3_test
Обновить Gemfile
gem 'sqlite3'
gem 'pg'
gem 'taps'
$ bundle
Обновить 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:
Запустить сервер кранов в базе данных sqlite
$ taps server sqlite://db/development.sqlite3 user password
Перенос данных
$ taps pull postgres://f3@localhost/f3_development http://user:password@localhost:5000
Перезапустить веб-сервер Rails
$ rails s
Очистка Gemfile
#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle
Поскольку вы переходите к герою, вы можете использовать краны для этого:
heroku db:push
Это подтолкнет ваши локальные данные sqlite развития к производству, и heroku автоматически преобразует в postgres для вас.
Это также должно работать, чтобы подтолкнуть производственный sqlite db к герою, но он не протестирован.
RAILS_ENV=production heroku db:push
Просто обновите файл 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:
Выше приведено то, что сгенерировано при запуске:
$ rails new projectname --database=postgresql --skip-test-unit
Также добавьте это в свой Gemfile:
gem 'pg'
вам также понадобится добавить строку " gem 'pg'" в ваш gemfile, а pg - текущий камень postgres для Rails.
Просто обновите 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
Мы используем рельсы, а базовые стандарты должны следовать примеру DRY, Console Configuration и т.д., поэтому в приведенном выше коде мы не повторяем тот же код снова и снова.
После замены gem 'sqlite3
на gem pg
в gemfile я продолжал получать sqlite3 error
при нажатии на мастер Heroku, потому что забыл зафиксировать обновленный gemfile. Просто следующее решение было решено:
git add .
git commit -m 'heroku push'
heroku create
git push heroku master
Это было упомянуто выше меня, но у меня нет достаточной репутации, как lurker, чтобы иметь возможность продвигать его. В надежде привлечь немного больше внимания для новичков Rails, читающих этот ответ:
вам также понадобится добавить строку "gem" pg '' в ваш gemfile, "pg" - это текущий камень postgres для Rails.
^^^ Это ключевая деталь в дополнение к файлу database.yml, описанному в выбранном ответе, чтобы перенести приложение Rails на Postgres.
Вот как у меня есть моя установка. Если вы используете только МРТ, а не Jruby, вы можете пропустить логику в настройках адаптера.
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
Теперь стало легко с командой
bin/rails db:system:change --to=postgresql
если у вас есть какие-либо сомнения, вы можете проверить здесь
https://github.com/rails/rails/pull/34832
Сегодня у меня была такая же проблема. Я работаю над Rails 4.2.8. Решением было указать версию pg gem, в моем случае 0.18.4
.
Возможное решение (не для героку) использовать yaml.db из:
Вы можете попробовать следующее:
sqlite3 development.db .dump | psql dbname username
или попробуйте с sqlitetopgscript: http://trac-hacks.org/browser/sqlitetopgscript/0.10/sqlite2pg