Переход от 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


возможное решение (не для heroku) - использовать yaml.db from:

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


сегодня у меня была та же проблема. Я работаю над Rails 4.2.8. Решением было указать версию PG gem, в моем случае,0.18.4.