Переход от SQLite к PostgreSQL в новом проекте Rails
У меня есть приложение rails, базы данных которого находятся в SQLite (dev и production). Поскольку я переезжаю в heroku, я хочу преобразовать свою базу данных в PostgreSQL.
в любом случае, я слышал, что локальная, разработка, база данных не должна быть изменена с SQLite, поэтому мне не нужно менять это, однако, как я могу изменить рабочую среду с SQLite на PostgreSQL?
кто-нибудь делал это раньше и может помочь?
P. S. Я не уверен как именно этот процесс называется, но я слышал о миграции базы данных из SQLite в PostgreSQL, это то, что нужно сделать?
12 ответов
вы можете изменить свою базу данных.yml для этого вместо использования из коробки sqlite one:
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
шаги работал для меня. Он использует краны gem, созданный Heroku и упомянутый в Railscast #342 Райана Бейтса. Есть несколько шагов, но он работал отлично (даже даты были правильно перенесены), и это было намного проще, чем Oracle -> DB2 или SQL Server -> Oracle migrations, которые я делал в прошлом.
обратите внимание, что SQLite не имеет идентификатора пользователя или пароля, но taps gem требует чего-то. Я просто использовал литералы "user" и "пароль."
создайте пользователя базы данных 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
обновить базу данных.в формате 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:
запустите сервер taps на 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, вы можете использовать краны, чтобы сделать это:
heroku db:push
это подтолкнет ваши локальные данные разработки sqlite к производству, и heroku автоматически преобразуется в postgres для вас.
Это также должно работать, чтобы подтолкнуть производственную БД sqlite к heroku, но она не протестирована.
RAILS_ENV=production heroku db:push
вам также нужно будет добавить строку"gem 'pg' "в ваш gemfile," pg " является текущим драгоценным камнем postgres для Rails.
просто обновите конфигурацию / базу данных.файл 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 'sqlite3
с gem pg
в gemfile я продолжал получать sqlite3 error
при нажатии на Heroku master, потому что я забыл зафиксировать обновленный gemfile. Просто делать следующее решил это:
git add .
git commit -m 'heroku push'
heroku create
git push heroku master
просто обновить вы 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
мы используем рельсы и основные стандарты должны следовать как сухой, Конвенция над конфигурацией ЕТК.. таким образом, в приведенном выше коде мы не повторяем один и тот же код снова и снова.
Это было упомянуто выше меня, но у меня нет достаточной репутации как скрывающегося, чтобы быть в состоянии его поднять. В надежде привлечь немного больше внимания для новичков Rails, читающих этот ответ:
вам также нужно будет добавить строку " gem ' pg '"в свой gemfile," pg " является текущим драгоценным камнем postgres для Rails.
^^^ это ключевой элемент в дополнение к базе данных.файл 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
вы можете попробовать следующие:
sqlite3 development.db .dump | psql dbname username
или попробуйте использовать sqlitetopgscript: http://trac-hacks.org/browser/sqlitetopgscript/0.10/sqlite2pg
сегодня у меня была та же проблема. Я работаю над Rails 4.2.8. Решением было указать версию PG gem, в моем случае,0.18.4
.