window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster już istnieje') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Zarządzanie strukturą bazy danych w wielu oddziałach - The Codest
The Codest
  • O nas
  • Nasze Usługi
    • Software Development
      • Frontend Development
      • Backend Development
    • Zespoły IT
      • Programiści frontendowi
      • Backend Dev
      • Inżynierowie danych
      • Inżynierowie rozwiązań chmurowych
      • Inżynierowie QA
      • Inne
    • Konsultacje IT
      • Audyt i doradztwo
  • Branże
    • Fintech i bankowość
    • E-commerce
    • Adtech
    • Healthtech
    • Produkcja
    • Logistyka
    • Motoryzacja
    • IOT
  • Wartość dla
    • CEO
    • CTO
    • Delivery Managera
  • Nasz zespół
  • Case Studies
  • Nasze Know How
    • Blog
    • Meetups
    • Webinary
    • Raporty
Kariera Skontaktuj się z nami
  • O nas
  • Nasze Usługi
    • Software Development
      • Frontend Development
      • Backend Development
    • Zespoły IT
      • Programiści frontendowi
      • Backend Dev
      • Inżynierowie danych
      • Inżynierowie rozwiązań chmurowych
      • Inżynierowie QA
      • Inne
    • Konsultacje IT
      • Audyt i doradztwo
  • Wartość dla
    • CEO
    • CTO
    • Delivery Managera
  • Nasz zespół
  • Case Studies
  • Nasze Know How
    • Blog
    • Meetups
    • Webinary
    • Raporty
Kariera Skontaktuj się z nami
Strzałka w tył WSTECZ
2016-07-09
Software Development

Zarządzanie strukturą bazy danych w wielu oddziałach

Tomasz Kowalewski

Rozwijanie aplikacji to nie tylko wdrażanie nowych funkcji czy wprowadzanie poprawek. Czasami trzeba cofnąć zmiany i wrócić do poprzedniego etapu projektu. Częstym problemem pojawiającym się podczas pracy na wielu gałęziach jest utrzymanie odpowiedniej wersji struktury bazy danych. Programiści korzystający z railsów mają do dyspozycji gotowe rozwiązania. Rozwiązania te wspierają implementację i kontrolę zmian w bazie danych - są to migracje. Nie będę opisywał jak to działa i jakie daje możliwości - chciałbym skupić się na problemie utrzymania odpowiedniej wersji struktury bazy danych podczas przełączania gałęzi.

Warstwa bazodanowa aplikacji jest odrębnym bytem i jest kontrolowana wyłącznie przez migracje. Tworząc nowe migracje należy pamiętać, aby planowana transformacja struktury bazy danych była odwracalna. Oczywiście w skrajnych przypadkach możemy podnieść IrreversibleMigration w w dół metoda. Poinformuje nas to również o tym, że migracji nie można cofnąć. Istnieją różne rodzaje zmian, które wprowadzamy podczas migracji - tworzenie, modyfikowanie i usuwanie tabel, kolumn lub indeksów. Operacje usuwania i modyfikowania są najbardziej wrażliwe na zmiany. Dlaczego? Rozważmy następujący scenariusz:Pracujemy z gałęzią master, która jest naszą główną ścieżką roboczą. Obecnie mamy jedną tabelę:

 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

Nasz Artykuł model ma takie walidacje, które wymagają obecności nazwa, opis i status atrybuty.

 class Artykuł < ActiveRecord::Base
   waliduje :name, obecność: true
   validates :description, presence: true
   validates :status, presence: true
 end

Wdrażamy zmiany w naszych artykuły tabela na cecha i usuwamy gałąź rozwojową status kolumna.

 class RemoveStatusColumnFromArticles < ActiveRecord::Migration
   def change
     remove_column :articles, :status, :string
   end
 end

Przeprowadzamy migrację:

 $ [example/feature]: bundle exec rake db:migrate
 == 20150605120955 RemoveStatusColumnFromArticles: migracja ===================
 -- remove_column(:articles, :status, :string)
   -> 0.0717s
 == 20150605120955 RemoveStatusColumnFromArticles: zmigrowano (0.0718s) ==========

Schemat bazy danych ulega zmianie:

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 @@ #

Zdecydowanie zaleca się sprawdzenie tego pliku w systemie kontroli wersji.

-ActiveRecord::Schema.define(version: 20150605120350) do
+ActiveRecord::Schema.define(version: 20150605120955) do
  createtable "articles", force: :cascade do |t|
    t.string "name"
    t.text "description"
- t.string "status", null: false t.datetime "createdat", null: false
    t.datetime "updated_at", null: false
  end

end

Następnie zatwierdzamy zmiany w pliku cecha branch. Aby zasymulować ten problem, przełączamy bieżącą gałąź na master. Struktura bazy została zmieniona przez migrację, która usuwa sekcję status w kolumnie cecha branch. Spróbujmy użyć następującego polecenia:

Article.create!(name: "Kaboom", description: "Lorem ipsum...", status: "active")

Co się stanie po wykonaniu powyższego kod? Błąd: ActiveRecord::UnknownAttributeError: nieznany atrybut "status" dla artykułu a to z powodu niekompatybilnej wersji struktury bazy danych. Przed zmianą gałęzi na master powinniśmy cofnąć migrację, która usuwa bazę danych status z kolumny Artykuł tabela.

Co możemy zrobić, aby sprawdzić, czy musimy cofnąć niektóre migracje przed przełączeniem gałęzi? Za pomocą systemu kontroli wersji (tutaj jest to git) możemy sprawdzić naszą pracę, tworząc pomocny alias:

 ~/.gitconfig
 [alias]
  migrations = "!f() { git diff --name-only $1..$2 db/migrate | tr -d '[A-Za-z/_.]'; }; f"

Wykonywanie git migrations master feature Polecenie spowoduje wyświetlenie listy wersji migracji, które znajdują się na stronie cecha i których nie można znaleźć na mistrz.

 $ [przykład/funkcja]: główna funkcja migracji git
 20150605120955

Dzięki tym informacjom możemy łatwo cofnąć zmiany dokonane w strukturze bazy danych przed przełączeniem na master.

 $ [example/feature]: bundle exec rake db:migrate:down VERSION=20150605120955
 == 20150605120955 RemoveStatusColumnFromArticles: przywrócenie ===================
 -- add_column(:articles, :status, :string)
   -> 0.0009s
 == 20150605120955 RemoveStatusColumnFromArticles: przywrócono (0.0045s) ==========

Jeszcze jedną rzeczą, którą powinniśmy zrobić po wycofaniu migracji, jest przywrócenie stanu schematu bazy danych.

$ [example/feature]: git status
Na gałęzi funkcji
Zmiany nie zostały zatwierdzone:
 (użyj "git add ...", aby zaktualizować to, co zostanie zatwierdzone)
 (użyj "git checkout -- ...", aby odrzucić zmiany w katalogu roboczym)

zmodyfikowano: db/schema.rb

brak zmian dodanych do zatwierdzenia (użyj "git add" i/lub "git commit -a")
$ [example/feature]: git checkout db/schema.rb
$ [example/feature]: git status
Na gałęzi funkcji
nic do zatwierdzenia, katalog roboczy czysty

Teraz możemy łatwo przełączyć się na mistrz oddział.

Podany przykład nie jest skomplikowanym problemem do rozwiązania, ale powinien pomóc ci uświadomić sobie, jak ważne jest utrzymanie struktury bazy danych podczas zmiany kontekstu pracy.

Powiązane artykuły

Software Development

Tworzenie przyszłościowych aplikacji internetowych: spostrzeżenia zespołu ekspertów The Codest

Odkryj, w jaki sposób The Codest wyróżnia się w tworzeniu skalowalnych, interaktywnych aplikacji internetowych przy użyciu najnowocześniejszych technologii, zapewniając płynne doświadczenia użytkowników na wszystkich platformach. Dowiedz się, w jaki sposób nasza wiedza napędza transformację cyfrową i biznes...

THEECODEST
Software Development

10 najlepszych firm tworzących oprogramowanie na Łotwie

Dowiedz się więcej o najlepszych łotewskich firmach programistycznych i ich innowacyjnych rozwiązaniach w naszym najnowszym artykule. Odkryj, w jaki sposób ci liderzy technologiczni mogą pomóc w rozwoju Twojej firmy.

thecodest
Rozwiązania dla przedsiębiorstw i scaleupów

Podstawy tworzenia oprogramowania Java: Przewodnik po skutecznym outsourcingu

Zapoznaj się z tym niezbędnym przewodnikiem na temat skutecznego tworzenia oprogramowania Java outsourcing, aby zwiększyć wydajność, uzyskać dostęp do wiedzy specjalistycznej i osiągnąć sukces projektu z The Codest.

thecodest
Software Development

Kompletny przewodnik po outsourcingu w Polsce

Wzrost liczby outsourcing w Polsce jest napędzany przez postęp gospodarczy, edukacyjny i technologiczny, sprzyjający rozwojowi IT i przyjazny klimat dla biznesu.

TheCodest
Rozwiązania dla przedsiębiorstw i scaleupów

Kompletny przewodnik po narzędziach i technikach audytu IT

Audyty IT zapewniają bezpieczne, wydajne i zgodne z przepisami systemy. Dowiedz się więcej o ich znaczeniu, czytając cały artykuł.

The Codest
Jakub Jakubowicz CTO & Współzałożyciel

Subskrybuj naszą bazę wiedzy i bądź na bieżąco!

    O nas

    The Codest - Międzynarodowa firma programistyczna z centrami technologicznymi w Polsce.

    Wielka Brytania - siedziba główna

    • Office 303B, 182-184 High Street North E6 2JA
      Londyn, Anglia

    Polska - lokalne centra technologiczne

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Warszawa, Polska

      The Codest

    • Strona główna
    • O nas
    • Nasze Usługi
    • Case Studies
    • Nasze Know How
    • Kariera
    • Słownik

      Nasze Usługi

    • Konsultacje IT
    • Software Development
    • Backend Development
    • Frontend Development
    • Zespoły IT
    • Backend Dev
    • Inżynierowie rozwiązań chmurowych
    • Inżynierowie danych
    • Inne
    • Inżynierowie QA

      Raporty

    • Fakty i mity na temat współpracy z zewnętrznym partnerem programistycznym
    • Z USA do Europy: Dlaczego amerykańskie startupy decydują się na relokację do Europy?
    • Porównanie centrów rozwoju Tech Offshore: Tech Offshore Europa (Polska), ASEAN (Filipiny), Eurazja (Turcja)
    • Jakie są największe wyzwania CTO i CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Warunki korzystania z witryny

    Copyright © 2025 by The Codest. Wszelkie prawa zastrzeżone.

    pl_PLPolish
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek pl_PLPolish