Kontrola wersji bazy danych dla MySQL

Jakiej metody używasz do sterowania wersją bazy danych? Popełniłem wszystkie nasze tabele baz danych jako osobne skrypty .sql do naszego repozytorium (mercurial). W ten sposób, jeśli którykolwiek członek zespołu dokona zmiany w tabeli pracowników, powiedzmy, natychmiast dowiem się, która konkretna tabela została zmodyfikowana, gdy zaktualizowałem moje repozytorium.

Taka metoda została opisana w:Jakie są najlepsze praktyki dotyczące skryptów baz danych pod kontrolą kodu. Obecnie piszę skrypt Pythona, aby wykonać wszystkie pliki .sql w folderze bazy danych, jednak kwestia zależności ze względu na ograniczenia klucza obcego gwarantuje, że nie możemy po prostu uruchomić plików .sql w dowolnej kolejności.

Skrypt Pythona służy do generowania pliku z kolejnością wykonywania plików .sql. Wykonuje pliki .sql w kolejności, w jakiej pojawiają się w pliku tableorder.txt. Tabeli nie można wykonać, dopóki nie zostanie wykonana tabela kluczy obcych, na przykład:

tableorder.txt

table3.sql
table1.sql
table7.sql i tak dalej

Już wygenerowałem listę zależności dla każdej tabeli, z kodu, analizując wynik polecenia mysql „show create table”. Lista zależności może wyglądać tak:

tblstate: tblcountry //tblcountry.sql must be executed before tblstate.sql etc
tblemployee: tbldepartment, tblcountry

Aby wygenerować zawartość tableorder.txt, potrzebuję algorytmu, który będzie wyglądał tak:

function print_table(table):
  foreach table in database:
    if table.dependencies.count == 0
      print to tableorder.txt
    if table.dependencies.count > 0
      print_table(dependency) //print dependency first
end function

Jak sobie wyobrażasz, wiąże się to z dużą liczbą rekursji. Zaczynam się zastanawiać, czy jest to warte wysiłku? Jeśli jest tam jakieś narzędzie? Jakie narzędzie (lub algorytm) ma do wygenerowania listy kolejności wykonywania oddzielnych tabel i widoków .sql z uwzględnieniem zależności? Czy lepiej jest kontrolować wersję oddzielnego pliku .sql dla każdej tabeli / widoku lub lepiej, aby wersja kontrolowała całą bazę danych do pojedynczego pliku .sql? Będę wdzięczny za każdą odpowiedź, ponieważ zajęło to tyle dni. Dzięki.

questionAnswers(3)

yourAnswerToTheQuestion