Jest to kolejna część przedstawiająca użyteczność hook`ów Gita. W tym artykule przedstawię jakie możliwości daje połączenie Gita z bazą danych. Pisanie hook`ów w powłoce Bash daje nam możliwość używania poleceń konsolowych, więc możemy sterować bazą danych tak jak w oknie konsolowym (jeśli są dostępne polecenia mysql i mysqldump), co sprawia, że mamy spore pole do popisu. Zaczniemy od czegoś prostego.
Baza zdalna z podziałem na wersje developerską, testową i produkcyjną
W pliku repo.git/hooks/post-receive:
#!/bin/sh while read oldrev newrev ref do branch=`echo $ref | cut -d/ -f3` if [ "master" == "$branch" ]; then git --work-tree=/home/user/public_html/project/ checkout -f $branch mysqldump -u user_name --password="tajne" --no-data database_test > dbdump.sql mysql -u user_name --password="tajne" database_prod < dbdump.sql rm dbdump.sql echo 'Changes pushed to master.' fi if [ "test" == "$branch" ]; then git --work-tree=/home/user/public_html/project-test/ checkout -f $branch mysqldump -u user_name --password="tajne" database_dev > dbdump.sql mysql -u user_name --password="tajne" database_test < dbdump.sql rm dbdump.sql echo 'Changes pushed to test.' fi done
Jest to najprostsza możliwa wersja zarządzania bazą danych. W momencie, kiedy robimy push, hook post-receive rozpoznaje, którego brancha aktualizujemy i wykonuje odpowiednie dla niego polecenia. Kiedy aktualizujemy dev to nic się nie dzieje, bo jest to domyślna baza danycj dla developerów. W przypadku test baza jest kopiowana baza z wersji developerskiej do wersji testowej, a podczas wrzucania master baza z wersji testowej, ale bez danych (dodanie do polecenia parametru –no-data), ponieważ jest to baza główna na produkcji.
Bez nadpisywania
Aby dane się nie nadpisywały powinniśmy zgrać osobne strukturę i zawartość bazy, a potem przy wgrywaniu zainstalować kolejno, strukturę, co spowoduje wyczyszczenie naszych danych, a potem wgrać z powrotem wcześniej pobraną zawartość bazy.
mysqldump -u user_name --password="tajne" --no-data db_name_local > structure.sql mysqldump -u user_name --password="tajne" --no-create-info --complete-insert db_name_remote > data.sql mysql -u user_name --password="tajne" db_name_remote < structure.sql mysql -u user_name --password="tajne" db_name_remote < data.sql
W pierwszej linijce zrzucamy do pliku samą strukturę bez danych. Z racji, iż w pliku structure.sql są zawarte linie usuwające najpierw tabele, to jeśli nie chcemy stracić danych powinniśmy je również exportować. Robimy to w kolejnej linijce. Opcja –no-create-info powoduje zgranie samych danych bez tworzenia tabeli, a –complete-instert powoduje w zapytaniu INSERT dodanie nazw kolumn, do których przypisujemy dane. Jest to niezbędne w przypadku modyfikacji struktury tabeli.
Jest tylko jeden problem, jeśli zamiast rozszerzać table, usuniemy z niej jakieś pole to polecenie importu danych się wysypie. Nie pomoże nawet flaga –force.
Linki i źródła:
http://ben.kulbertis.org/2011/10/synchronizing-a-mysql-database-with-git-and-git-hooks/