napotkałem na pewien dylemat. Gdy używamy w postgresie hstore, na jakim poziomie dodawać do bazy rozszerzenie hstore?
Dodawać je w migracji (tak pokazano w railscastach - wtedy jednak rola wymaga dostępu superuser do bazy danych)
execute “'CREATE EXTENSION hstore”
Dodawać je bezpośrednio w bazie danych dla konkretnej bazy (wtedy aplikacja nie ma dostępu superuser, ale z kolei pojawia się zależność poza migracjami, a dodatkowo trzeba dodać to do bazy testowej)
psql <nazwa bazy> -c 'CREATE EXTENSION hstore;'
Dodać je na samym początku do szablonu z którego postgres tworzy kolejne bazy (znowu mamy jakąś konfiguracją poza migracjami, a dodatkowo możemy mieć jakieś bazy w których nie chcemy mieć tego włączonego, jednak wtedy z kolei nie ma problemu z bazami testowymi)
psql template1 -c ‘CREATE EXTENSION hstore;’
Żadna z tych metod niezbyt szczególnie mi się podoba - szczególnie w momencie deploymentu produkcyjnego.
Czy ustaliły się jakieś best practices, które mówiłyby jak to robić?
Ponieważ ustawia się to raz w cyklu życia całej bazy, włączyłbym to do wstępnego setupu bazy (na poziomie tworzenia użytkownika i grantowania mu praw do danej bazy), czyli przed pierwszym deploymentem czy odpaleniem migracji.
Jeśli planujesz zautomatyzować tworzenie infrastruktury, to naturalnym miejscem wydawały by się recepturki Puppetowe/Chefowe do konfiguracji bazy (i wtedy wchodzi w grę strategia 2 lub 3). W innym przypadku, koledzy powyżej poddali rozsądne propozycje (osobiście ostatnio wstawiałem w migracji, ale nie będę mial problemu z prawami dostępu do bazy, o czym wspomniałeś przy strategii nr 1).
Dodatek do bazy pozwalający whitelistować moduły, żeby mógł je dodać zwykły użytkownik (heroku z czegoś takiego korzysta, żeby każdy user mógł dodać sobie właśnie hstore).
I wtedy imho opcja to na serwerze + extension w migracji wydaje się najsensowniejsze, a lokalnie na bazach developerskich praca na superadminie.