O ile dostęp do wielu baz naraz można uzyskać przez definicje w stylu
development:a następnie przez stworzenie modeli Proxy:
<<: *dev_basics
database: import_sharded
host: 127.0.0.1
import_development:
<<: *dev_basics
database: import
host: 127.0.0.1
class ImportProxy < ActiveRecord::Baseo tyle problem pojawia się w migracjach - jak zapewnić aby migracje działały na różnych bazach ?
establish_connection "import_#{RAILS_ENV.split('_').last}"
end
Sprawa okazała się trywialna:
class CreateImportOffers < ActiveRecord::Migrationwystarczyło nadpisać metode connection.
def self.connection
ImportProxy.connection
end
def self.up
create_table :offers do |t|
Tu jednak sprawa sie nie kończy bo jak pisałem na wstępie mamy to do czynienia z bazami shardowanymi a informacje o przeprowadzponych migracjach są trzymane tylko w 1 miejscu,
czyli jesli serwer S1 wykonal wszystkie migracje - czesc globalnych a czesc lokalnie na swojej bazie , zakładam że główne połączenie jest do bazy wspólnej to serwer S2 już nic nam nie będzie chciał zrobić a jego baza lokalna pozostanie pusta. Odwracając sytuacje gdzie główne połączenie jest na bazie lokalnej to wystąpi konflikt przy migracjach na bazie wspólnej - 1 z serwerów nie będzie wiedział że migracje już zostały wykonane.
Rozwiązanie ? Może 2 osobne projekty - 1 działający na maszynach shardowanych a 2gi działający na maszynie wspólnej ?
Taki też był pierwszy pomysł, ale w rzeczywistosci oba projekty różniły by się jedynie katalogiem migracji i plikiem databases.yml - wszystko inne było by w jakiś sposób linkowane.
Bez sensu.
Naszczescie znalazlem gotowe rozwiązanie tego problemu - plugin loopy_multiple_databases
Co to mi dało ?
Teraz mam możliwosc spearacji migracji per środowisko - osobne podkatalogi w db/migrate, w zależniości od sposobu uruchamiania wykonuje się inny zestaw migracji:
RAILS_ENV=import_development rake db:migrate:up VERSION=20090520143515domyślne zadanie rake db:migrate zostało nadpisane i powoduje wykonanie migracji na wszystkich zdefiniowanych środowiskach poprzez uruchomienie:
RAILS_ENV=development rake db:migrate:up VERSION=20090520113821
RAILS_ENV=srodowisko rake db:migrate_without_other_databases
Brak komentarzy:
Prześlij komentarz