Doctrine z istniejącą bazą

0

Witam

Pracuję nad aplikacją w Symfony 3 i planuje zarządzać bazą za pomocą Doctrine
Sprawa wygląda tak, że jestem zmuszony pracować na istniejącej już (i całkiem solidnie rozbudowanej) bazie danych a chciałbym mieć pewność, że Doctrine w żaden sposób nie zmodyfikuje jej struktury.

Jako, że z Symfony pracuję od niedawna to nie jestem pewien jak się za to zabrać, jedno z rozwiązań jakie znalazłem to użycie polecania w konsoli:
php bin/console doctrine:mapping:import --force MyAppBundle annotation
Utworzone w ten sposób klasy użyłbym do zarządzania bazą.

Czy taki sposób jest odpowiedni i zagwarantuje mi, że struktura bazy w żaden sposób się nie zmieni, tak długo aż sam nie będę tego potrzebował?

Pozdrawiam :)

0

Nie masz pewności - dlatego przed deploym robi się testy. To tylko importer, ktory generuje ci rzeczy z istniejącej bazy danych. Jak zaimportujesz - to wtedy nic sie nie zmieni. Ale natomiast jesli zmienisz po imporcie coz na bazie danych (zmienisz schemat), a pozniej zrobisz w doctrine update schema, to tak: te zmiany zostana usunięte.

0

Jeśli wykonasz odpowiednie polecenia i zaimportujesz też metadane to powinno być ok tak długo jak sam nic nie zmienisz w encjach - czyli dopóki nie będziesz chciał wprowadzić zmian. Wtedy tak jak pisze @bordeux poprzez polecenie schema:update możesz nadpisać bazę danych. Ale to przypadkiem się nie stanie. ;)

Przy generowaniu encji z istniejącej bazy trzeba pamiętać, że samo polecenie doctrineimport nie wystarczy. Aby odpowiednio wygenerować encje i zależności musisz wklepać 3 polecenia:

# zapisuje strukturę do pliku annotacji (lub innego formatu jaki wybierzesz) 
$ php bin/console doctrine:mapping:convert annotation ./src/MyAppBundle/Resources/config/doctrine/metadata/orm --from-database --force
# importuje strukturę
$ php bin/console doctrine:mapping:import MyAppBundle annotation
# generuje pliki klas encji
$ php bin/console doctrine:generate:entities MyAppBundle 

Do tego trzeba pamiętać, że jeśli w bazie nie ma dodanych kluczy obcych (zdarza się) to generator będzie to komunikował i cała akcja się nie powiedzie - relacje muszą być w bazie.

Co więcej - jeśli pomiędzy encjami ma być relacja jeden do wielu to musisz dodać ją ręcznie do annotacji w encji lub wygenerowanego pliku orm.yml/xml. Trzeba pamiętać że dla relacji dwustronnej (bidirectional) w odpowiednich encjach dodajesz sekcje inversedBy oraz mappedBy.

Więcej o generowaniu encji wg dokumentacji Sf: http://symfony.com/doc/current/doctrine/reverse_engineering.html

W samej dokumentacji doctrine 2 - http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/tools.html#convert-mapping-information - piszą o tym, że generator nie jest wystarczający. Zawsze jest potrzeba dokończenia pracy manualnie - sprawdzenia relacji, czy klucze obce nazwane są poprawnie, etc. - nie da się tego ominąć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1