Zarządzanie bazą danych za pomocą Gita #tutorial

Posted by

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 pushhook 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/

https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html

print

Leave a Reply

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *