Sovelluksen kehittäminen ei tarkoita vain uusien toimintojen käyttöönottoa tai korjaamista. Joskus muutokset on peruutettava ja palattava projektin edelliseen vaiheeseen. Usein esiin tuleva ongelma, kun työskennellään useiden haarojen parissa, liittyy tietokantarakenteen asianmukaisen version ylläpitoon. Kiskoja käyttävillä ohjelmoijilla on käytössään valmiita ratkaisuja. Nämä ratkaisut tukevat tietokantamuutosten toteuttamista ja hallintaa - nämä ovat migraatioita. En kuvaile, miten se toimii ja mitä mahdollisuuksia se tuo mukanaan - haluan keskittyä ongelmaan, joka liittyy tietokantarakenteen sopivan version ylläpitämiseen haarojen vaihtamisen aikana.
Sovelluksen tietokantakerros on erillinen olento, ja sitä hallitaan vain migraatioilla. Kun luot uusia migraatioita, muista tehdä tietokantarakenteen suunnitellusta muutoksesta palautuva. Ääritapauksissa voimme tietysti nostaa IrreversibleMigration
vuonna alas menetelmä. Tämä kertoo myös siitä, että siirtymistä ei voi peruuttaa. Siirtymisessä tehdään erityyppisiä muutoksia - luodaan, muutetaan ja poistetaan tauluja, sarakkeita tai indeksejä. Poisto- ja muokkaustoiminnot ovat herkimpiä muutoksille. Miksi? Tarkastellaan seuraavaa skenaariota: Työskentelemme master-haaralla, joka on päätyöpolkumme. Tällä hetkellä meillä on yksi taulukko:
class CreateArticles < ActiveRecord::Migration
def change
create_table :articles do |t|
t.string :name
t.text :description
t.string :status, null: false
t.timestamps null: false
end
end
end
Meidän Artikkeli
mallissa on tällaisia validointeja, jotka edellyttävät, että läsnä on nimi, kuvaus ja tila ominaisuudet.
class Artikkeli < ActiveRecord::Base
validates :name, presence: true
validates :description, presence: true
validates :status, presence: true
end
Toteutamme muutoksia artikkelit taulukko ominaisuus kehityshaaraan ja poistamme tila sarake.
class RemoveStatusColumnFromArticles < ActiveRecord::Migration
def change
remove_column :articles, :status, :string
end
end
Toteutamme migraation:
$ [example/feature]: bundle exec rake db:migrate
== 20150605120955 RemoveStatusColumnFromArticles: migrating ===================
-- remove_column(:articles, :status, :string)
-> 0.0717s
== 20150605120955 RemoveStatusColumnFromArticles: siirretty (0.0718s) ==========
Tietokannan skeema muuttuu:
diff --git a/db/schema.rb b/db/schema.rb
index 2a100a9..76438c1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,14 +11,13 @@ #
On erittäin suositeltavaa, että kirjaat tämän tiedoston versionhallintajärjestelmääsi.
-ActiveRecord::Schema.define(version: 20150605120350) do
+ActiveRecord::Schema.define(version: 20150605120955) do
createtable "articles", force: :cascade do |t|
t.string "nimi"
t.text "description"
- t.string "status", null: false t.datetime "createsat", null: false
t.datetime "updated_at", null: false
end
end
Seuraavaksi teemme muutokset tiedostoon ominaisuus haara. Simuloidaksemme tätä ongelmaa vaihdamme nykyisen haaran masteriksi. Perusrakennetta muutettiin migraatiolla, joka poistaa tiedoston tila sarakkeessa ominaisuus haara. Yritetään käyttää seuraavaa komentoa:
Article.create!(name: "Kaboom", description: "Lorem ipsum...", status: "active")
Mitä tapahtuu, kun edellä mainitut toimenpiteet on suoritettu koodi? Virhe: ActiveRecord::UnknownAttributeError: tuntematon attribuutti 'status' tuotteelle Article
ja se johtuu tietokannan yhteensopimattomasta rakenneversiosta. Ennen kuin muutamme haaran masteriksi, meidän pitäisi peruuttaa migraatio, joka poistaa version tila sarakkeesta Artikkeli pöytä.
Mitä voimme tehdä tarkistaaksemme, onko meidän peruutettava joitakin siirtoja ennen haarojen vaihtamista? Versiohallintajärjestelmän avulla (tässä se on git) voimme tarkistaa työmme luomalla hyödyllisen aliaksen:
~/.gitconfig
[alias]
migrations = "!f() { git diff --name-only $1..$2 db/migrate | tr -d '[A-Za-z/_.]'; }; f"
Suorittaminen git-siirtymät master-ominaisuus
komennon tuloksena saadaan luettelo siirtymisversioista, jotka sijaitsevat osoitteessa ominaisuus ja joita ei löydy osoitteesta master.
$ [esimerkki/ominaisuus]: git migrations master-ominaisuus
20150605120955
Tämän tiedon ansiosta voimme helposti peruuttaa tietokantarakenteeseen tehdyt muutokset ennen master-käyttöjärjestelmään siirtymistä.
$ [example/feature]: bundle exec rake db:migrate:down VERSION=20150605120955
== 20150605120955 RemoveStatusColumnFromArticles: palautetaan ===================.
-- add_column(:articles, :status, :string)
-> 0.0009s
== 20150605120955 RemoveStatusColumnFromArticles: palautettu (0.0045s) ==========
Vielä yksi asia, joka meidän pitäisi tehdä migraation palauttamisen jälkeen, on palauttaa tietokantakaavion tila.
$ [example/feature]: git status
Osiossa feature
Muutoksia ei ole siirretty toimitusta varten:
(käytä "git add ..." päivittääksesi, mitä tullaan toimittamaan).
(käytä "git checkout -- ..." hylätäksesi muutokset työhakemistossa).
Muutettu: db/schema.rb
ei muutoksia lisätty toimitukseen (käytä "git add" ja/tai "git commit -a").
$ [example/feature]: git checkout db/schema.rb
$ [example/feature]: git status
Osiossa ominaisuus
ei mitään siirrettävää, työhakemisto puhdas
Nyt voimme helposti vaihtaa master haara.
Tämä esimerkki ei ole monimutkainen ongelma, mutta sen pitäisi auttaa sinua ymmärtämään, miten tärkeää on säilyttää tietokannan rakenne työympäristön muuttuessa.