Перехід від 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.