Tworzenie extension w postgresie - best practices

Hej,

napotkałem na pewien dylemat. Gdy używamy w postgresie hstore, na jakim poziomie dodawać do bazy rozszerzenie hstore?

  1. Dodawać je w migracji (tak pokazano w railscastach - wtedy jednak rola wymaga dostępu superuser do bazy danych)

    execute “'CREATE EXTENSION hstore”

  2. 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;'
  1. 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.

1 Like

Ja bym wrzucił albo do migracji (pierwszej) albodo osobnego rake taska powiązanego np. z rake db:setup dużo zalezy od strategii deploymentu.

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 :slight_smile: (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).

Jest jeszcze kwestia tworzenia developerskiej bazy od zera.

Oczywiście można to dopisać w dokumentacji (czyli po rake db:create, następuje etap odpalenia komendy dodającej extension przez superadmina).

Znalazłem jeszcze czwartą opcję: https://github.com/dimitri/pgextwlist

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.