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

124

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

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

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

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

  • 2
    У вас есть живые данные о производстве, которые нужно дополнить, или это новое / свежее приложение?
  • 19
    Я бы порекомендовал вам также изменить среду разработки на PostgreSQL. SQLite и PostgreSQL (и любая другая база данных) имеют разные представления о том, что означает «действительный SQL», и ни один ORM не сможет изолировать вас от всех особенностей базы данных.
Показать ещё 1 комментарий
Теги:
database
heroku

13 ответов

97
Лучший ответ

Вы можете изменить свой 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 или имя моей базы данных?
  • 5
    Вы можете назвать это как хотите. Если ваш проект называется «калькулятор», я бы назвал их calculator_production, calculator_test, calculator_development
Показать ещё 7 комментариев
45

Следующие шаги работали для меня. Он использует драгоценный камень кранов, созданный 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
  • 3
    почему я должен использовать краны?
  • 0
    Работает чисто. Возможно, есть и другие решения, но я использовал это несколько раз без проблем.
Показать ещё 4 комментария
9

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

heroku db:push

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

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

RAILS_ENV=production heroku db:push
  • 1
    Похоже, что гем taps не очень хорошо работает с 1.9.3, вам может потребоваться установить 1.9.2 локально, чтобы запустить его - как только я это сделал, это было потрясающе гладко github.com/ricardochimal/taps/issues/93
  • 0
    Это больше невозможно. См. Этот вопрос для получения дополнительной информации: stackoverflow.com/questions/19817851/…
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'
5

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

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

3

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

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master
2

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

вам также понадобится добавить строку "gem" pg '' в ваш gemfile, "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
0

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

bin/rails db:system:change --to=postgresql

если у вас есть какие-либо сомнения, вы можете проверить здесь

https://github.com/rails/rails/pull/34832
0

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

0

Возможное решение (не для героку) использовать yaml.db из:

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

0

Вы можете попробовать следующее: sqlite3 development.db .dump | psql dbname username

или попробуйте с sqlitetopgscript: http://trac-hacks.org/browser/sqlitetopgscript/0.10/sqlite2pg

Ещё вопросы

Сообщество Overcoder
Наверх
Меню