Ruckusing Migrations część 3 – praktyk ciąg dalszy

W trzecim poście poświęconym bibliotece Ruckusing Migrations pokażę jakie jeszcze operacje można wykonać na bazie poza tworzeniem tabel. Zakładam, że czytając tego posta zapoznałeś się z pierwszą i drugą częścią tego kursu. Jeśli nie to zachęcam do lektury. Tymczasem zapraszam do czytania trzeciej części kursu poświęconego Ruckusing Migrations.

Uzyskiwanie informacji o serwerze baz danych, tabelach i kolumnach itd.

Zdarza się, że to jak zmodyfikujemy tabelę zależy od jej struktury, której aktualnie nie znamy nie jesteśmy jej do końca pewni lub chcemy po prostu sprawdzić czy nasze zmiany odniosły skutek. Aby uzyskać dostęp do odpowiednich funkcji musimy pobrać adapter za pomocą metody get_adapter ($adapter = $this->get_adapter()) i teraz możemy sprawdzić kilka informacji na temat serwera bazy na którym pracujemy.

Po pierwsze możemy sprawdzić czy wskazana przez nas baza danych istnieje:

Metoda ta zwróci TRUE lub FALSE. Metoda ta jest nie wspierana w przypadku SqlLite. Możemy także sprawdzić czy istnieje w bazie danych konkretna tabela, która nas interesuje:

Ta metoda również zwróci TRUE lub FALSE. Wreszcie możemy także uzyskać informacje na temat konkretnej kolumny:

W tym przypadku zamiast wartości typu boolean otrzymamy tablicę asocjacyjną, która będzie zawierała informacje o kolumnie takie jak nazwa, typ pola, collation (metoda porównywania znaków), czy może przyjmować wartość NULL, domyślna wartość, komentarz, uprawnienia i jeszcze kilka innych w zależności od typu pola. Jeśli jednak wskazana przez nas kolumna nie zostanie odnaleziona to metoda zwróci NULL.

Jako ostatni element możemy sprawdzić czy na daną kolumnę został nałożony indeks:

Inną metodą uzyskania informacji o indeksach jest metoda indexes, która jako parametr przyjmuje nazwę tabeli i zwraca tablicę z listą indeksów jakie są założone na tą tablicę.

Z adaptera można pobrać jeszcze nazwę aktualnie skonfigurowanej bazy (metoda get_database_name()), jak i natywnie typy jakie wspiera serwer bazy (metoda native_database_types()) czy wreszcie pobrać konfigurację połączenia z serwerem (metoda get_dsn()).

Adapter udostępnia jeszcze jedną metodę informacyjną o nazwie get_schema_version_table_name ale przy niej zatrzymam się na trochę dłużej.

W pliku konfiguracyjnym biblioteki obok nazwy bazy, hasła lub katalogu można ustawić jeszcze jedną właściwość normalnie nie wyszczególnioną w żaden sposób. Właściwość ta nazywa się schema_version_table_name i jak nie trudno się domyśleć odpowiada za nazwę tabeli w jakiej przechowywane są informacje o kolejnych wersjach bazy danych. Metoda get_schema_version_table_name służy do pobrania właśnie tej nazwy.

Manipulowanie bazami danych

Jeśli użytkownik, przez którego połączeni jesteśmy z serwerem ma takie uprawnienia możemy tworzyć i usuwać bazy danych. Przykład poniżej:

Metoda drop_database zwraca TRUE jeśli udało się usunąć bazę lub FALSE jeśli to się nie udało (np. wskazana baza nie istnieje).

Z kolei metoda create_database oprócz nazwy bazy może przyjąć drugi parametr, który odpowiada za dodatkowe parametry takie jak owner, encoding itd. jednak dotyczy to tylko bazy PostgreSql.

Te dwie metoda podobnie jak database_exists nie są obsługiwane w przypadku SqlLite.

Manipulowanie kolumnami

Oprócz tworzenia tabel, które zaprezentowałem w poprzedniej części możemy także modyfikować, dodawać i usuwać kolumny tabel znajdujących się  w bazie danych. I tak aby dodać nową kolumnę do istniejącej tabeli należy użyć metody add_column tak jak poniżej:

Pierwszy parametr do nazwa tabeli, do której chcemy dodać kolumnę, drugi to nazwa kolumny, trzeci to typ danych a czwarty to dodatkowe parametry takie jak np. długość stringu. Wartości jakie mogą przyjmować dwa ostatnie parametry opisałem w poprzednim poście i w przypadku wątpliwości odsyłam właśnie do niego.

Jeśli natomiast chcemy zmienić parametry istniejącej kolumny, mamy do dyspozycji dwie metody. Pierwsza z nich to rename_column, która jak nie trudno zgadnąć służy do zmiany nazwy kolumny:

Pierwszy parametr to nazwa tablicy, drugi to aktualna nazwa kolumny a trzeci to nowa nazwa kolumny.

Druga metoda służąca do zmiany parametrów kolumny czyli change_column ma znacznie więcej możliwości:

Jej parametry są dokładnie takie same jak przy omawianej kilka akapitów wcześniej metodzie add_column.

Istnieje także metoda służąca do usuwania istniejących już kolumn. Mowa o remove_column. Jako pierwszy parametr przyjmuje ona nazwę tabeli a jako drugi nazwę kolumny, która ma zostać usunięta:

Indeksy

Tutaj sprawa jest prosta. Indeksy można dodawać za pomocą metody add_index w następujący:

Ta metoda może jeszcze przyjąć trzeci parametr, który jest tablicą i można dzięki niej podać jeszcze dwa parametry takie jak to czy indeks ma zawierać wartości unikalne:

Oprócz tego można jeszcze ustawić własną nazwę indeksu:

$this->add_index(„nazwa_tabeli”, „nazwa_kolumny”, array(‘name’ => ‘custom_name’));

Indeks można nałożyć także na kilka kolumn jednocześnie. W tym celu należy podać zamiast nazwy kolumny jako string tablicę zawierającą listę kolumn.

Tyle w kwestii dodawania indeksów – usuwanie jest równie proste i posłuży do tego metoda remove_index. Aby usunąć indeks o domyślnej nazwie wystarczy wywołać tą metodę z dwoma parametrami:

Jeśli istnieje potrzeba usunięcia indeksu o innej niż domyślna nazwa należy użyć trzeciego parametru. Ten parametr to tablica w której w kluczu ‘name’ należy podać niestandardową nazwę indeksu:

Czas utworzenia i ostatniej aktualizacji rekordu

Aby dodać do tabeli kolumny, które automatyczne będą przechowywać czas utworzenia rekordu i ostatniej aktualizacji należy użyć metody add_timestamps:

Po wykonaniu tej metody do tabeli zostaną dodane dwie kolumny o nazwie created_at i updated_at. Kolumny te można usunąć używając metody remove_timestamps, ale co w przypadku gdy z jakiegoś powodu chcemy nadać inne nazwy tym kolumnom niż domyślne? W takim przypadku należy wywołać metodę add_timestamps z dodatkowymi argumentami.

Tutaj jednak dwie uwagi. Po pierwsze jeśli dodacie kolumny z niestandardowymi nazwami i później będziecie chcieli je usunąć za pomocą remove_timestamps zostaniecie poczęstowani przez bibliotekę wyjątkiem informującym o tym, że metoda nie może znaleźć kolumn o domyślnych nazwach. Programowanie to nie magia i metoda w cudowny sposób nie zgadnie jakie własne nazwy nadaliście kolumnom.

Po drugie jeśli chcecie nadać własne nazwy to musicie podać je zarówno w przypadku kolumny odpowiadającej za czas utworzenia rekordu jak i za czas modyfikacji. W przeciwnym wypadku także zostaniecie poczęstowani wyjątkiem – tym razem informującym o tym, że brakuje argumentu podczas wywołania metody.

Escapowanie stringów

Tu sprawa jest bardzo prosta i aby wykonać tą operację należy użyć metody quote_string. Jako parametr podajemy string, który ma zostać poddany escapowaniu a metoda zwróci już „przerobiony” ciąg znaków.

Pobieranie rekordów z bazy

Jeśli chcemy pobrać określone rekordy w bazie danych to mamy do wyboru dwie metody: select_one i select_all. W obu przypadkach podaje się zapytanie jako parametr (SELECT lub SHOW) a różnią się tylko zwracanym wynikiem.

W przypadku select_one zwracany jest pierwszy rekord z listy a w przypadku select_all wszystkie. Ciekawostką jest to, że metoda select_all jest tak naprawdę nakładką na metodę query (opisaną poniżej).

Wykonywanie dowolnego zapytania

Teraz opiszę najczęściej wykorzystywaną (tak wynika z moich obserwacji) metodę jaką udostępnia ta biblioteka. Chodzi mianowicie o query. Wykonuje ona zapytanie jakie podamy w parametrze podczas wywoływania tej metody:

To, co zwróci ta funkcja zależy od tego jakiego typu zapytanie podamy w parametrze. W tym konkretnym przypadku zwróci tablicę asocjacyjną zawierającą wersję serwera bazy danych. Tak samo postąpi jeśli podamy zapytanie SHOW * czyli zwróci wynik zapytania. Gdy mamy do czynienia z INSERTem zwróci id wstawionego rekordu a w przypadku UPDATE, DELETE etc TRUE jeśli zapytanie wykona się poprawnie.

Za pomocą tej metody można wykonać praktycznie każde zapytanie łącznie ze wszelkiego typu ALTERami etc pod warunkiem, że mamy do czynienia z pojedynczym zapytaniem.

W następnym odcinku…

… napiszę kilka słów na temat transakcji a także tworzenia logów i zrzutów bazy. Tak więc do przeczytania już wkrótce i mam nadzieję, że na następny odcinek nie będziecie musieli tak długo czekać 😉

Posty które mogą Cię zainteresować:

Dodaj komentarz

Your email address will not be published. Please enter your name, email and a comment.