Pertanyaan Menghubungkan Rails 3.1 dengan Multiple Databases


Di ShowNearby kami telah melakukan migrasi sangat besar ke RoR 3.1 dari PHP dan kami menghadapi beberapa masalah yang mungkin sebagian dari Anda telah pecahkan sebelumnya.

Kami memiliki sejumlah besar data dan kami memutuskan untuk memisahkan DB kami menjadi beberapa DB yang dapat kami tangani secara terpisah. Misalnya, akun, tempat, log, dan lainnya kami dibagi menjadi beberapa basis data

Kita perlu mendapatkan migrasi, perlengkapan, model, untuk bermain dengan baik, dan sejauh ini sudah sangat berantakan. Beberapa persyaratan kami untuk solusi dapat diterima:

  • satu model harus berhubungan dengan satu tabel di salah satu database.
  • rake db: drop - harus drop semua env database yang kita tentukan dalam database.yml
  • rake db: create - harus membuat semua env database yang kita tentukan dalam database.yml
  • rake db: bermigrasi - harus menjalankan migrasi ke berbagai database
  • rake db: test - harus mengambil perlengkapan dan menjatuhkannya ke berbagai database dan unit / fungsi uji / dll

Kami sedang mempertimbangkan untuk menetapkan proyek rel yang terpisah per setiap basis data dan menghubungkannya dengan ActiveResource, tetapi kami merasa ini tidak sangat efisien. Apakah ada di antara Anda yang berurusan dengan masalah serupa sebelumnya?

Terima kasih banyak!!


76
2018-05-25 09:50


asal


Jawaban:


Untuk jawaban Wukerplank, Anda juga dapat memasukkan detail koneksi dalam database.yml seperti biasa dengan nama seperti:

log_database_production:
  adapter: mysql
  host: other_host
  username: logmein
  password: supersecret
  database: logs

Kemudian dalam model khusus Anda:

class AccessLog < ActiveRecord::Base
  establish_connection "log_database_#{Rails.env}".to_sym
end

Untuk menjaga kredibilitas sial itu agar tidak ada dalam kode aplikasi Anda.

Edit: Jika Anda ingin menggunakan kembali koneksi ini dalam beberapa model, Anda harus membuat kelas abstrak baru dan mewarisi darinya, karena koneksi digabungkan secara erat ke kelas (seperti dijelaskan sini, sini, dan sini), dan koneksi baru akan dibuat untuk setiap kelas.

Jika itu masalahnya, atur semuanya seperti ini:

class LogDatabase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "log_database_#{Rails.env}".to_sym
end

class AccessLog < LogDatabase
end

class CheckoutLog < LogDatabase
end

141
2018-05-25 15:11



Menghubungkan ke berbagai basis data cukup mudah:

# model in the "default" database from database.yml
class Person < ActiveRecord::Base

  # ... your stuff here

end

# model in a different database
class Place < ActiveRecord::Base

  establish_connection (
    :adapter  => "mysql",
    :host     => "other_host",
    :username => "username",
    :password => "password",
    :database => "other_db"
  )

end

Saya akan mewaspadai pengaturan beberapa proyek Rails karena Anda akan menambahkan banyak overhead untuk pengambilan data untuk pengendali Anda, yang bisa membuat hal-hal menjadi lambat.

Adapun pertanyaan Anda tentang migrasi, perlengkapan, model dll. Saya pikir tidak akan ada cara mudah, jadi tolong posting pertanyaan terpisah dan sespesifik yang Anda bisa.

Mengkonsolidasikan DB menjadi satu bukan merupakan pilihan? Itu akan membuat hidup Anda jauh lebih mudah!


18
2018-05-25 10:06



Temukan pos yang bagus yang akan mengarahkan orang lain ke cara yang benar untuk melakukan pemeriksaan ini http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html

Setel sesuatu seperti ini:

database.yml (file db config)

support_development:
    adapter: blah
    database: blah
    username: blah
    password: blah

support_base.rb (file model)

class SupportBase < ActiveRecord::Base
    self.abstract_class = true #important!
    establish_connection("support_development")
end

tst_test.rb (file model)

class TstTest < SupportBase 
    #SupportBase not ActiveRecord is important!

    self.table_name = 'tst_test'

    def self.get_test_name(id)
        if id = nil
            return ''
        else
            query = "select tst_name from tst_test where tst_id = \'#{id}\'"
            tst = connection.select_all(query) #select_all is important!
            return tst[0].fetch('tst_name')
        end
    end
end

PS, ini benar-benar tidak mencakup migrasi, saya tidak berpikir Anda dapat melakukan migrasi pada lebih dari satu DB dengan penggaruk (meskipun saya tidak yakin itu sulit 'tidak bisa dilakukan', hal itu mungkin dilakukan). Ini adalah cara yang bagus untuk menghubungkan dan meminta DB lain yang tidak Anda kendalikan.


11
2017-07-13 23:59



Anda mungkin juga ingin menambahkan lingkungan Rails, sehingga database pengembangan dan pengujian Anda tidak sama.

establish_connection "legacy_#{Rails.env}"

4
2018-05-16 13:18



Itu artikel berikut menyarankan mendefinisikan tugas Rake baru untuk mencapai migrasi terhadap beberapa basis data. Setiap tugas mengatur koneksi sendiri dan kemudian mengeksekusi migrasi dengan koneksi ini dan folder database spesifik.

Ini juga mendefinisikan familiar db:migrate yang memanggil dua tugas lainnya.

Termasuk di sini memetikan tautan menjadi tidak tersedia:

desc "Migrate the database through scripts in db/migrate directory."

namespace :db do
  task :migrate do
    Rake::Task["db:migrate_db1"].invoke
    Rake::Task["db:migrate_db2"].invoke
  end

  task :migrate_db1 do
    ActiveRecord::Base.establish_connection DB1_CONF
    ActiveRecord::Migrator.migrate("db/migrate/db1/")
  end

  task :migrate_db2 do
    ActiveRecord::Base.establish_connection DB2_CONF
    ActiveRecord::Migrator.migrate("db/migrate/db2/")
  end
end

Sumber:  Ruby on Rails Terhubung ke Beberapa Database dan Migrasi


3
2018-06-17 14:30



Hei posting ini sudah tua tapi saya sudah menemukan solusi yang bekerja di Rails 3.2 yang mungkin bisa membantu orang lain. https://stackoverflow.com/a/16542724/1447654


1
2018-05-14 13:35