Yeni bir Rails projesinde SQLite'den PostgreSQL'e geçiş


124

Veritabanları SQLite'de (geliştirme ve üretim) olan bir raylar uygulamam var. Heroku'ya geçtiğim için veritabanımı PostgreSQL'e dönüştürmek istiyorum.

Her neyse, yerel, geliştirme, veritabanının SQLite'den değiştirilmesi gerekmediğini duydum, bu yüzden bunu değiştirmeme gerek yok, ancak üretim ortamını SQLite'den PostgreSQL'e nasıl değiştirebilirim?

Bunu daha önce yapan ve yardımcı olabilecek biri var mı?

Not: Bu işlemin tam olarak ne olarak adlandırıldığından emin değilim, ancak veritabanını SQLite'den PostgreSQL'e taşımayı duydum, yapılması gereken bu mu?


2
Birlikte gitmesi gereken canlı prodüksiyon verileriniz var mı yoksa yeni / yeni bir uygulama mı?
Dylan Markow

19
Geliştirme ortamınızı da PostgreSQL olarak değiştirmenizi tavsiye ederim. SQLite ve PostgreSQL (ve diğer tüm veritabanları) "geçerli SQL" in ne anlama geldiği konusunda farklı fikirlere sahiptir ve hiçbir ORM sizi veritabanının tüm özelliklerinden ayıramaz.
mu çok kısa

Yanıtlar:


101

Database.yml dosyanızı kutudan çıkan sqlite birini kullanmak yerine bununla değiştirebilirsiniz:

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 veya veritabanımın adını koymalı mıyım?
Vasseurth

5
Ne istersen adlandırabilirsin. Projenizin adı 'hesap makinesi' ise, bunları calculator_production, calculator_test, calculator_development olarak adlandırırım
Chris Barretto

2
@mmichael gerçekten postgres'inizi nasıl ayarladığınıza bağlı. MacOS X Lion + kullanıyorsanız postgres.app, brew veya native kullanmak, varsayılan kurulumlarında farklı kısıtlamalara sahiptir. Dolayısıyla, kullanıcı adı ve şifre geçerli değilse, bunları dışarıda bırakabilir veya hiçbir değer girmeden bırakabilirsiniz. Bu daha çok 'tümünü yakalama' tipi bir konfigürasyondu.
Chris Barretto

2
"& TEST" orada ne yapıyor (satır 9)?
David Rhoden

2
"& TEST" TEST'i varsayılan seçenek kümesi olarak ayarlıyor. Daha sonra geçersiz kılınabilir veya sadece dışarıda bırakılabilir. "<<: * TEST" varsayılan @DavidRhoden'e erişmenin yoludur
Chris Barretto

44

Aşağıdaki adımlar benim için çalıştı. Heroku tarafından oluşturulan ve Ryan Bates'in Railscast # 342'sinde bahsedilen musluk mücevherini kullanır . Birkaç adım var, ancak mükemmel çalıştı (tarihler bile doğru şekilde geçirildi) ve geçmişte yaptığım Oracle -> DB2 veya SQL Server -> Oracle geçişlerinden çok daha kolaydı.

SQLite'ın bir kullanıcı kimliği veya şifresi olmadığını, ancak dokunma taşının bir şey gerektirdiğini unutmayın. Ben sadece "kullanıcı" ve "şifre" kelimelerini kullandım.

Yeni veritabanları için Postgres veritabanı kullanıcısını oluşturun

$ 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 - Aşağıdaki komut güncellendi - bunun yerine bunu kullanın

$ createuser f3 -d -s

Gerekli veritabanlarını oluşturun

$ createdb -Of3 -Eutf8 f3_development
$ createdb -Of3 -Eutf8 f3_test

Gemfile'ı güncelleyin

gem 'sqlite3'
gem 'pg'
gem 'taps'
$ bundle

Database.yml'yi güncelle

#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 veritabanında taps sunucusunu başlatın

$ taps server sqlite://db/development.sqlite3 user password

Verileri taşıyın

$ taps pull postgres://f3@localhost/f3_development http://user:password@localhost:5000

Rails web sunucusunu yeniden başlatın

$ rails s

Gemfile'ı temizleyin

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle

10

Heroku'ya geçtiğiniz için, bunu yapmak için dokunmaları kullanabilirsiniz:

heroku db:push

Bu, yerel geliştirme sqlite verilerinizi üretime itecek ve heroku sizin için otomatik olarak postgres'e dönüştürecektir.

Bu aynı zamanda bir üretim sqlite veri tabanını heroku'ya itmek için çalışmalıdır, ancak test edilmemiştir.

RAILS_ENV=production heroku db:push

1
taps gem 1.9.3 ile iyi çalışmıyor gibi görünüyorsa, onu çalıştırmak için yerel olarak 1.9.2 yüklemeniz gerekebilir - bunu yaptıktan
sbeam

Bu artık mümkün değil. Daha fazla bilgi için şu soruya bakın: stackoverflow.com/questions/19817851/…
sykaeh

5

ayrıca gemfile dosyanıza " gem 'pg " satırını eklemeniz gerekecektir, "pg" Rails için geçerli postgres gemidir.


5

Config / database.yml dosyasını güncellemeniz yeterlidir:

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: 

Yukarıdakiler, çalıştırdığınızda oluşturulanlardır:

$ rails new projectname --database=postgresql --skip-test-unit

Ayrıca bunu Gemfile'ınıza ekleyin:

gem 'pg'

5

Artık tek komutla kolaylaştı

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

1
Bu harika bir cevap, database.yml dosyasını ihtiyaç duyulan değerlerle değiştiriyor. Yine de oraya gidebilir ve veritabanı adını projenize göre değiştirebilirsiniz.
csal Almeida

3

Gemfile'da gem'i gem 'sqlite3ile değiştirdikten sonra , güncellenmiş gemfile'ı teslim etmeyi unuttuğum için Heroku ustasına iterken pgalmaya devam sqlite3 errorettim. Basitçe aşağıdakileri yapmak bunu çözdü:

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

3

Sadece datatbase.yml'yi güncelleyin

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

Ray kullanıyoruz ve DRY, Konfigürasyon Üzerinden Konvansiyon vb. Gibi temel standartlara uyulmalıdır. Bu nedenle yukarıdaki kodda aynı kodu tekrar tekrar tekrarlamıyoruz.


2

Yukarıda benden bahsedilmişti, ancak bir pusuda oy kullanabilmek için yeterli itibarım yok. Bu cevabı okuyan Rails'e yeni başlayanlar için biraz daha dikkat çekme umuduyla:

ayrıca gemfile'ınıza "gem 'pg" satırını eklemeniz gerekecektir, "pg" Rails için geçerli postgres gemidir.

^^ ^ Bu, Rails uygulamanızı Postgres'e taşımak için seçilen yanıtta açıklanan database.yml dosyasına ek olarak önemli bir parçadır.


1

Benim kurulumum bu şekilde. Jruby değil, yalnızca MRI kullanıyorsanız, adaptör ayarlarında mantığı atlayabilirsiniz.

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

Bugün aynı sorunu yaşadım. Rails 4.2.8 üzerinde çalışıyorum. Çözüm, benim durumumda pg gem versiyonunu belirlemekti 0.18.4.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.