Перехід від SQLite до PostgreSQL у новому проекті Rails


125

У мене є додаток для рейок, що бази даних знаходяться в SQLite (розробник і виробництво). Оскільки я переходжу до heroku, я хочу перетворити свою базу даних у PostgreSQL.

У будь-якому разі я чув, що локальну, розробку, базу даних не потрібно міняти з SQLite, тому мені не потрібно це змінювати, однак, як я можу змінити виробниче середовище з SQLite на PostgreSQL?

Хтось колись робив це раніше і може допомогти?

PS Я не впевнений, як саме називається цей процес, але я чув про перенесення бази даних з SQLite на PostgreSQL, це те, що потрібно робити?


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 або ім’я моєї бази даних?
— Вассерт

5
Ви можете назвати його все, що завгодно. Якщо назва вашого проекту "калькулятор", я б назвав їх калькулятор_виробництво, калькулятор_тест, калькулятор_розвиток
— Кріс Барретто

2
@mmichael, це дійсно залежить від налаштування ваших поштових розсилок. Якщо ви користуєтеся postgres.app, варити або рідною мовою, якщо ви працюєте на MacOS X Lion +, у вас є різні обмеження щодо налаштування за замовчуванням. Тож якщо ім’я користувача та пароль не застосовуються, ви можете залишити їх або не вказати значення. Це було лише більше типом конфігурації "ловш усіх".
— Кріс Барретто

2
Що там робить "ІТЕСТ" (рядок 9)?
— Девід Роден

2
"& TEST" встановлює TEST як набір параметрів за замовчуванням. Пізніше їх можна буде замінити або просто залишити. "<<: * TEST" - це спосіб отримати доступ до стандартного @DavidRhoden
— Кріс Барретто

44

Наведені нижче кроки працювали для мене. Він використовує крани камінь, створений Heroku і згадується в Райана Бейтса 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:

Запустіть сервер 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

10

Оскільки ви переходите до heroku, для цього ви можете скористатися кранами:

heroku db:push

Це підштовхне ваші локальні дані sqlite розвитку до виробництва, а heroku автоматично перетворить на постгреси для вас.

Це також має працювати, щоб підштовхнути виробничий sqlite db до heroku, але це не перевірено.

RAILS_ENV=production heroku db:push

1
дорогоцінна камінь, здається, не працює добре з 1.9.3, вам може знадобитися встановити 1.9.2 локально, щоб змусити її працювати - як тільки я це зробив, це було розумно
— sbeam

Це вже неможливо. Дивіться це питання для отримання додаткової інформації: stackoverflow.com/questions/19817851 / ...
— sykaeh

5

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

5

Тепер це стало легко за допомогою однієї команди

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

1
Це чудова відповідь, вона змінює database.yml з необхідними значеннями. Ви все ще можете зайти туди і змінити ім'я бази даних відповідно до свого проекту.
— csalmeida

3

Після заміни дорогоцінних каменів 'sqlite3з перлиною pgв Gemfile, я продовжував отримувати sqlite3 errorпри натисканні на майстер Heroku , тому що я забув зробити оновлений Gemfile. Просто це вирішило наступне:

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

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, Конвенція про конфігурацію тощо. Отже, у наведеному вище коді ми не повторюємо той самий код знову і знову.


2

Про мене це вже згадувалося, але я не маю достатньої репутації прихованця, щоб мати змогу це підтримати. Сподіваючись привернути трохи більше уваги для 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



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.