Переход с SQLite на PostgreSQL в новом проекте Rails - PullRequest
122 голосов
/ 15 июля 2011

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

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

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

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

Ответы [ 13 ]

98 голосов
/ 15 июля 2011

Вы можете изменить свой database.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
43 голосов
/ 13 августа 2012

Шаги ниже работали для меня. Он использует камень taps , созданный 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:

Запустить сервер 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
9 голосов
/ 15 июля 2011

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

heroku db:push

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

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

RAILS_ENV=production heroku db:push
5 голосов
/ 17 февраля 2015

Просто обновите файл 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 голосов
/ 31 июля 2011

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

3 голосов
/ 04 декабря 2013

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

3 голосов
/ 27 октября 2012

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

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master
2 голосов
/ 23 января 2019

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

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

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

https://github.com/rails/rails/pull/34832
2 голосов
/ 09 июня 2012

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

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

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

1 голос
/ 11 августа 2014

Вот так у меня есть мои настройки. Если вы используете только MRI, а не 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...