Переход с SQLite на PostgreSQL в новом проекте Rails

125

У меня есть приложение rails, в котором базы данных находятся в SQLite (разработка и производство). Поскольку я перехожу на heroku, я хочу преобразовать свою базу данных в PostgreSQL.

В любом случае, я слышал, что локальную базу данных разработки не нужно менять с SQLite, поэтому мне не нужно менять это, однако, как мне изменить производственную среду с SQLite на PostgreSQL?

Кто-нибудь делал это раньше и может помочь?

PS Я не уверен, как именно называется этот процесс, но я слышал о переносе базы данных с SQLite на PostgreSQL, это то, что нужно сделать?

Vasseurth
источник
2
У вас есть оперативные производственные данные, которые необходимо приложить к нему, или это новое / свежее приложение?
Дилан Маркоу
19
Я бы порекомендовал вам также сменить среду разработки на PostgreSQL. SQLite и PostgreSQL (и любая другая база данных) имеют разные представления о том, что означает «действительный SQL», и никакой ORM не может изолировать вас от всех идиосинкразий базы данных.
mu слишком короткий

Ответы:

101

Вы можете изменить свой 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
Крис Барретто
источник
1
Я должен поставить project_test или имя моей базы данных?
Vasseurth
5
Вы можете называть это как хотите. Если ваш проект называется «калькулятор», я бы назвал их «Calculator_production», «Calculator_test», «Calculator_development»
Крис Барретто,
2
@mmichael, это действительно зависит от того, как у вас настроены ваши postgres. Использование postgres.app, brew или native, если вы используете MacOS X Lion +, имеет другие ограничения на настройку по умолчанию. Поэтому, если имя пользователя и пароль неприменимы, вы можете не указывать их или вводить без значений. Это была просто конфигурация «улова всех».
Крис Барретто
2
Что там делает '& TEST' (строка 9)?
Дэвид Роден
2
«& ТЕСТ» устанавливает ТЕСТ в качестве набора параметров по умолчанию. Позже они могут быть отменены или просто не учтены. «<<: * TEST» - это способ получить доступ к @DavidRhoden по умолчанию
Крис Барретто
44

Следующие ниже шаги сработали для меня. Он использует краны камень, созданный Heroku и упоминается в Райана Бейтса Railscast # 342. Есть несколько шагов, но это сработало отлично (даже даты были правильно перенесены), и это было намного проще, чем миграции Oracle -> DB2 или SQL Server -> Oracle, которые я делал в прошлом.

Обратите внимание, что SQLite не имеет идентификатора пользователя или пароля, но для гема taps что-то требуется. Я просто использовал литералы «пользователь» и «пароль».

Создайте пользователя базы данных 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

РЕДАКТИРОВАТЬ - Обновленная команда ниже - используйте это вместо

$ 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
ardochhigh
источник
10

Поскольку вы переходите в Heroku, вы можете использовать касания для этого:

heroku db:push

Это переведет ваши локальные данные sqlite для разработки в производство, а heroku автоматически преобразует их в postgres.

Это также должно работать, чтобы отправить рабочую базу данных sqlite на heroku, но это не тестировалось.

RAILS_ENV=production heroku db:push
Джесси Волгамотт
источник
1
gem taps, похоже, не работает с 1.9.3, вам может потребоваться установить 1.9.2 локально, чтобы запустить его - как только я это сделал, это было потрясающе гладко github.com/ricardochimal/taps/issues/93
sbeam
Это уже невозможно. См. Этот вопрос для получения дополнительной информации: stackoverflow.com/questions/19817851/…
sykaeh
5

вам также нужно будет добавить строку « gem 'pg' » в ваш гем-файл, где «pg» будет текущим гемом postgres для Rails.

Гас Шортц
источник
5

Просто обновите файл 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'
jungledre
источник
5

Теперь это стало проще с одной командой

bin/rails db:system:change --to=postgresql
К АБХИРАМ
источник
1
Это отличный ответ, он меняет database.yml на необходимые значения. Вы все равно можете зайти туда и изменить имя базы данных в соответствии с вашим проектом.
csalmeida
3

После замены gem 'sqlite3на gem pgв gemfile я продолжал получать при sqlite3 errorнажатии на мастер Heroku, потому что я забыл зафиксировать обновленный gemfile. Это решило простое выполнение следующих действий:

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master
Zorak
источник
3

Просто обновите ваш 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, Convention over Configuration и т. Д., Поэтому в приведенном выше коде мы не повторяем один и тот же код снова и снова.

Сунил
источник
2

Об этом упоминалось выше меня, но у меня недостаточно репутации скрытня, чтобы я мог проголосовать за него. В надежде привлечь немного больше внимания новичков Rails, читающих этот ответ:

вам также нужно будет добавить строку «gem 'pg'» в ваш гем-файл, где «pg» будет текущим гемом postgres для Rails.

^^^ Это ключевая часть в дополнение к файлу database.yml, описанному в выбранном ответе, для переноса вашего приложения Rails в Postgres.

Джастин Хоук
источник
1

Вот как у меня устроена моя установка. Если вы используете только МРТ, а не 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
ianks
источник
0

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

Бенджамин Пенья Ольвера
источник