Ubah dari SQLite ke PostgreSQL di proyek Rails baru

125

Saya punya aplikasi rel yang databasenya ada di SQLite (The dev and production). Karena saya pindah ke heroku, saya ingin mengonversi database saya ke PostgreSQL.

Ngomong-ngomong, saya mendengar bahwa basis data lokal, pengembangan, tidak perlu diubah dari SQLite, jadi saya tidak perlu mengubahnya, namun, bagaimana cara mengubah lingkungan produksi dari SQLite ke PostgreSQL?

Adakah yang pernah melakukan ini sebelumnya dan dapat membantu?

PS Saya tidak yakin apa sebenarnya proses ini disebut, tetapi saya pernah mendengar tentang migrasi database dari SQLite ke PostgreSQL, apakah itu yang perlu dilakukan?

Vasseurth
sumber
2
Apakah Anda memiliki data produksi langsung yang perlu disertakan, atau apakah itu aplikasi baru / segar?
Dylan Markow
19
Saya sarankan Anda mengubah lingkungan pengembangan Anda ke PostgreSQL juga. SQLite dan PostgreSQL (dan setiap basis data lainnya) memiliki gagasan berbeda tentang apa arti "SQL yang valid" dan tidak ada ORM yang dapat melindungi Anda dari semua kekhasan basis data.
mu terlalu pendek

Jawaban:

101

Anda dapat mengubah database.yml Anda dengan ini alih-alih menggunakan kotak sqlite di luar kotak:

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
Chris Barretto
sumber
1
Haruskah saya menaruh project_test atau nama basis data saya?
Vasseurth
5
Anda dapat memberi nama apa pun yang Anda inginkan. Jika nama proyek Anda adalah 'kalkulator', saya akan menamakannya calculator_production, calculator_test, calculator_development
Chris Barretto
2
@mmichael itu benar-benar tergantung pada bagaimana Anda mengatur postgres Anda. Menggunakan postgres.app, brew, atau asli jika Anda menggunakan MacOS X Lion + memiliki batasan berbeda pada pengaturan defaultnya. Jadi jika nama pengguna dan kata sandi tidak berlaku, Anda dapat mengabaikannya, atau tanpa nilai. Ini hanya tipe konfigurasi 'tangkap semua'.
Chris Barretto
2
Apa yang dilakukan '& TEST' di sana (baris 9)?
David Rhoden
2
"& TEST" menetapkan TEST sebagai set pilihan default. Mereka nanti bisa diganti atau ditinggalkan begitu saja. "<<: * TEST" adalah cara untuk mengakses @DavidRhoden default
Chris Barretto
44

Langkah-langkah di bawah ini berhasil untuk saya. Itu menggunakan permata keran , dibuat oleh Heroku dan disebutkan dalam Railscast # 342 Ryan Bates. Ada beberapa langkah tetapi bekerja dengan sempurna (bahkan tanggal pun dimigrasikan dengan benar), dan itu jauh lebih mudah daripada Oracle -> DB2 atau SQL Server -> migrasi Oracle yang telah saya lakukan di masa lalu.

Perhatikan bahwa SQLite tidak memiliki id pengguna atau kata sandi, tetapi gem ketukan memerlukan sesuatu. Saya hanya menggunakan literal "pengguna" dan "kata sandi".

Buat pengguna basis data Postgres untuk basis data baru

$ 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 - Perintah yang diperbarui di bawah ini - gunakan ini sebagai gantinya

$ createuser f3 -d -s

Buat database yang diperlukan

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

Perbarui Gemfile

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

Perbarui 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:

Mulai keran server pada basis data sqlite

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

Migrasikan data

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

Mulai ulang server web Rails

$ rails s

Bersihkan Gemfile

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle
ardochhigh
sumber
10

Karena Anda pindah ke heroku, Anda dapat menggunakan keran untuk melakukan ini:

heroku db:push

Ini akan mendorong data sqlite pengembangan lokal Anda ke produksi, dan heroku akan secara otomatis dikonversi ke postgres untuk Anda.

Ini juga harus berfungsi untuk mendorong produksi sqlite db ke heroku, tetapi tidak diuji.

RAILS_ENV=production heroku db:push
Jesse Wolgamott
sumber
1
permata keran tampaknya tidak berfungsi dengan baik dengan 1.9.3, Anda mungkin perlu menginstal 1.9.2 secara lokal untuk menjalankannya - begitu saya melakukannya, github.com/ricardochimal/taps/issues/93
sbeam
Ini tidak lagi mungkin. Lihat pertanyaan ini untuk info lebih lanjut: stackoverflow.com/questions/19817851/…
sykaeh
5

Anda juga perlu menambahkan baris " gem 'pg' " ke gemfile Anda, 'pg' menjadi permata postgres saat ini untuk Rails.

Gus Shortz
sumber
5

Cukup perbarui file 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: 

Di atas adalah apa yang dihasilkan saat Anda menjalankan:

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

Juga tambahkan ini ke Gemfile Anda:

gem 'pg'
hutan belantara
sumber
5

Sekarang menjadi mudah dengan perintah tunggal

bin/rails db:system:change --to=postgresql
K ABHIRAM
sumber
1
Ini adalah jawaban yang bagus, itu mengubah database.yml dengan nilai yang dibutuhkan. Anda masih bisa masuk ke sana dan mengubah nama database sesuai dengan proyek Anda.
csalmeida
3

Setelah mengganti permata 'sqlite3dengan permata pgdi gemfile, saya terus mendapatkan sqlite3 errorketika mendorong ke master Heroku karena saya lupa untuk melakukan pembaruan gemfile. Cukup melakukan hal berikut ini menyelesaikan ini:

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master
Zorak
sumber
3

Perbarui saja datatbase.yml Anda

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

Kami menggunakan rel dan standar dasar harus mengikuti seperti KERING, Konvensi alih Konfigurasi dll. Jadi dalam kode di atas kita tidak mengulangi kode yang sama lagi dan lagi.

sunil
sumber
2

Sudah disebutkan di atas saya, tetapi saya tidak memiliki reputasi yang cukup sebagai lurker untuk dapat meningkatkannya. Dengan harapan menarik lebih banyak perhatian untuk pemula Rails membaca jawaban ini:

Anda juga perlu menambahkan baris "gem 'pg'" ke gemfile Anda, 'pg' menjadi permata postgres saat ini untuk Rails.

^^^ Ini adalah bagian penting selain file database.yml yang dijelaskan dalam jawaban yang dipilih untuk memigrasikan aplikasi Rails Anda ke Postgres.

Justin Houk
sumber
1

Ini adalah bagaimana saya memiliki pengaturan milik saya. Jika Anda hanya menggunakan MRI dan bukan Jruby, Anda dapat melewati logika di pengaturan adaptor.

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
ianks
sumber
0

Hari ini saya memiliki masalah yang sama. Saya sedang mengerjakan Rails 4.2.8. Solusinya adalah menentukan versi permata pg, dalam kasus saya 0.18.4,.

Benjamin Peña Olvera
sumber