Installazione di PostgreSQL11/PostGIS su macOS (e Linux) via Homebrew. Il terminale interattivo- psql

Ivano Giuliano
8 min readMar 2, 2019

--

Introduzione a Homebrew

Homebrew e’ un gestore di pacchetti che semplifica egregiamente, il processo di installazione di software e strumenti da riga di comando su macchine macOS, Linux, ma anche Windows 10 (Subsystem Linux). E’ un progetto non-profit, gestito interamente da volontari non retribuiti:

https://github.com/Homebrew/brew#donations.

Homebrew ,permette di scaricare e installare rapidamente programmi ,compilandoli dal sorgente. Homebrew Cask inoltre, estende le funzionalita’ di Homebrew, supportando le installazioni di app binarie, quelle per intenderci, che gli users macOS trascinano nella cartella applicazioni dai DMG files, oltre a fonts, plugin e altri pacchetti non open-source.

L’installazione di Homebrew, e’ particolarmente semplice, bastera’ aprire una finestra del Terminale, copiare e incollare il segunete comando e premere invio.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Lo script e’ molto chiaro, in quanto informa in ogni istante, in merito alle operazioni che si stanno svolgendo. E’ necessario fornire la password da amministratore per poter procedere alla installazione. Importante, di default lo script ruby, installa Homebrew in modo da poter utilizzare il comando brew, senza inserire ogni volta il comando sudo, che permette di eseguire programmi assumendo l’identità e i privilegi di altri utenti (switch user do).

Homebrew installa i pacchetti nelle loro directory, creando inoltre un collegamento simbolico in /usr/local.

A questo punto, e’ possibile andare a ricercare i pacchetti disponibili attraverso il comando che segue. Nel merito del presente articolo cerchiamo postgresql.

brew search postgresql

Come mostrato dallo screenshot, abbiamo a disposizioni diversi pacchetti installabili. Procediamo con l’installazione di postgresql@11. Il Comando necessario per compiere l’operazione e’ il seguente:

brew install petere/postgresql/postgresql@11

E’ bene sottolineare, che questo pacchetto non rappresenta una major releases, ma una formulae, in quanto Homebrew non dispone dell’intera gamma di versioni principali supportate, vengono definite tecnicamente keg_only e vengono denotate con la @. Una formula è una definizione di pacchetto scritta in Ruby. Le formule utilizzano l’API Formula che fornisce vari helper specifici per Homebrew.

Ultimato il completamento della installazione di PostgreSQL, passiamo alla installazione di PostGIS…

brew install postgis

Ora il database e’ configurato ed e’ possibile accedervi, creando nuovi utenti e passwords. Nel caso si volesse fare pulizia del sistema per eventuali altre versioni di installazione, e’ possibile sempre rimuovere quanto installato, attraverso i comandi :

brew remove postgis
...
brew remove postgresql

Homebrew utilizza Git per il downloading, updating e contributing e si installa in Cellar, come si nota nella path contenuta nel precedente screenshot collegando parte della installazione in usr/local, gia’ precedentemente mezionato, in modo da essere visibile da altre applicazioni.

/usr/local/Cellar/…

E’ bene sapere che tali pacchetti vengono installati in base alle loro formule, ubicate in:

/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula

Come si puo’ notare le estensioni sono ruby. Diamo un semplice sguardo a titolo di curiosita’, per vedere la struttura di una formula, per es. di git, lanciandone un edit in brew:

brew edit git

Ci sarebbe molto da approfondire, ma passiamo oltre.

PSQL — Client testuale di connessione al database

Vi sono un’ampia varieta’ di strumenti di terze parti per amministrare e gestire PostgreSQL, come ad es. SQL Workbench/J e il piu’ diffuso pgAdmin. Tuttavia esiste un potente strumento fornito in bundle con PstgreSQL, ottimo per chi ha familiarita’ con la riga di comando, che permette di eseguire attivita’ di script e di amministrazione, del potentissimo object-relational database system in oggetto. Sapere quali database risiedono sul proprio server o quali tabelle sono archiviate in un definito database, sono informazioni basilari. Ecco che psql ci permette di fare questo e non solo.

Procediamo dapprima, con lo start di PostgreSQL…

pg_ctl -D /usr/local/var/postgres start

Vi sono una varieta’ di flag disponibili lavorando con psql, ma i principali sono :

-h the host to connect to

-U the user to connect with

-p the port to connect to (default is 5432)

psql -h localhost -U username databasename

Procediamo con il creare un nuovo database denominato PRGC…(attenzione ai nomi perche’ e’ CASE SENSITIVE!)

createdb PRGC

…abilitiamo il db PRGG,

psql PRGC

…creiamo una estensione per PostGIS,

CREATE EXTENSION postgis;

e verifichiamone poi la versione di PostGIS con…

select postgis_version();

Possiamo visualizzare lo schema del db creato…

\dn[S+] [PATTERN]      list schemas

Notate il simbolo # , questo identifica un prompt di amministratore. Bene, a questo punto cimentiamoci con il creare una semplice tabella in PRGC,

CREATE TABLE pg_parcel (
p_id serial PRIMARY KEY,
foglio varchar (50) NOT NULL,
mappale varchar (25) NOT NULL,
destinazione varchar(25) check (destinazione in ('residenziale', 'commerciale', 'parcheggio', 'usi pubblici', 'agricolo', 'produttivo')),
install_date date
);

Visualizzazione del risultato a Terminale della tabella creata :

\d[S+] list tables, views, and sequences

Chiaramente e poi possibile procedere con il suo popolamento. Qui di seguito una lista dei comandi psql , richiamabili con l’help: \?. Questi consentono di effettuare introspezione sulla struttura del db.

General
\copyright show PostgreSQL usage and distribution terms
\crosstabview [COLUMNS] execute query and display results in crosstab
\errverbose show most recent error message at maximum verbosity
\g [FILE] or ; execute query (and send results to file or |pipe)
\gdesc describe result of query, without executing it
\gexec execute query, then execute each value in its result
\gset [PREFIX] execute query and store results in psql variables
\gx [FILE] as \g, but forces expanded output mode
\q quit psql
\watch [SEC] execute query every SEC seconds
Help
\? [commands] show help on backslash commands
\? options show help on psql command-line options
\? variables show help on special variables
\h [NAME] help on syntax of SQL commands, * for all commands
Query Buffer
\e [FILE] [LINE] edit the query buffer (or file) with external editor
\ef [FUNCNAME [LINE]] edit function definition with external editor
\ev [VIEWNAME [LINE]] edit view definition with external editor
\p show the contents of the query buffer
\r reset (clear) the query buffer
\s [FILE] display history or save it to file
\w FILE write query buffer to file
Input/Output
\copy … perform SQL COPY with data stream to the client host
\echo [STRING] write string to standard output
\i FILE execute commands from file
\ir FILE as \i, but relative to location of current script
\o [FILE] send all query results to file or |pipe
\qecho [STRING] write string to query output stream (see \o)
Conditional
\if EXPR begin conditional block
\elif EXPR alternative within current conditional block
\else final alternative within current conditional block
\endif end conditional block
Informational
(options: S = show system objects, + = additional detail)
\d[S+] list tables, views, and sequences
\d[S+] NAME describe table, view, sequence, or index
\da[S] [PATTERN] list aggregates
\dA[+] [PATTERN] list access methods
\db[+] [PATTERN] list tablespaces
\dc[S+] [PATTERN] list conversions
\dC[+] [PATTERN] list casts
\dd[S] [PATTERN] show object descriptions not displayed elsewhere
\dD[S+] [PATTERN] list domains
\ddp [PATTERN] list default privileges
\dE[S+] [PATTERN] list foreign tables
\det[+] [PATTERN] list foreign tables
\des[+] [PATTERN] list foreign servers
\deu[+] [PATTERN] list user mappings
\dew[+] [PATTERN] list foreign-data wrappers
\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions
\dF[+] [PATTERN] list text search configurations
\dFd[+] [PATTERN] list text search dictionaries
\dFp[+] [PATTERN] list text search parsers
\dFt[+] [PATTERN] list text search templates
\dg[S+] [PATTERN] list roles
\di[S+] [PATTERN] list indexes
\dl list large objects, same as \lo_list
\dL[S+] [PATTERN] list procedural languages
\dm[S+] [PATTERN] list materialized views
\dn[S+] [PATTERN] list schemas
\do[S] [PATTERN] list operators
\dO[S+] [PATTERN] list collations
\dp [PATTERN] list table, view, and sequence access privileges
\drds [PATRN1 [PATRN2]] list per-database role settings
\dRp[+] [PATTERN] list replication publications
\dRs[+] [PATTERN] list replication subscriptions
\ds[S+] [PATTERN] list sequences
\dt[S+] [PATTERN] list tables
\dT[S+] [PATTERN] list data types
\du[S+] [PATTERN] list roles
\dv[S+] [PATTERN] list views
\dx[+] [PATTERN] list extensions
\dy [PATTERN] list event triggers
\l[+] [PATTERN] list databases
\sf[+] FUNCNAME show a function’s definition
\sv[+] VIEWNAME show a view’s definition
\z [PATTERN] same as \dp
Formatting
\a toggle between unaligned and aligned output mode
\C [STRING] set table title, or unset if none
\f [STRING] show or set field separator for unaligned query output
\H toggle HTML output mode (currently off)
\pset [NAME [VALUE]] set table output option
(NAME := {border|columns|expanded|fieldsep|fieldsep_zero|
footer|format|linestyle|null|numericlocale|pager|
pager_min_lines|recordsep|recordsep_zero|tableattr|title|
tuples_only|unicode_border_linestyle|
unicode_column_linestyle|unicode_header_linestyle})
\t [on|off] show only rows (currently off)
\T [STRING] set HTML <table> tag attributes, or unset if none
\x [on|off|auto] toggle expanded output (currently off)
Connection
\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}
connect to new database (currently “postgis_prova”)
\conninfo display information about current connection
\encoding [ENCODING] show or set client encoding
\password [USERNAME] securely change the password for a user
Operating System
\cd [DIR] change the current working directory
\setenv NAME [VALUE] set or unset environment variable
\timing [on|off] toggle timing of commands (currently off)
\! [COMMAND] execute command in shell or start interactive shell
Variables
\prompt [TEXT] NAME prompt user to set internal variable
\set [NAME [VALUE]] set internal variable, or list all if no parameters
\unset NAME unset (delete) internal variable
Large Objects
\lo_export LOBOID FILE
\lo_import FILE [COMMENT]
\lo_list
\lo_unlink LOBOID large object operations

Digitiamo \q per uscire da PostgreSQL e ritorniamo alla finestra del Terminale.

Conclusioni

Prima di procedere alla installazione di Homebrew per gli utenti macOS, e’ necessario avere a disposizione gli strumenti da riga di comando per Xcode, che dovra’ essere gia’ installato sul sistema. Dal Terminale e’ molto semplice, bastera’ seguire il seguente comando :

xcode-select --installNOTA: Xcode rappresenta un ambiente di sviluppo integrato (Integrated development environment, IDE) contenente una suite di strumenti utili per lo sviluppo di software per i sistemi macOS.
Questa rappresenta una fase molto consistente in termini di tempo di download, di memoria e di pazienza. Purtroppo la suite non è più in bundle da un po’ di tempo con il sistema operativo, ma è possibile scaricarlo gratuitamente in due modi:
a) dal Mac App Store : https://itunes.apple.com/us/app/xcode/id497799835?mt=12
b)dal sito degli sviluppatori: https://developer.apple.com/xcode/

Mi auguro che la lettura di questo articolo possa essere di supporto a tutti coloro che poco utilizzano comandi da Terminale, e scoprirne le potenzialita’ con Homebrew per la installazione e la ricerca di pacchetti e all’uso del Client testuale psql/PostgreSQL per la gestione dei db. Per approfondimenti, e’ possibile cliccare sul testo che appare sottolineato, che rimanda direttamente ai rispettivi siti ufficiali.

--

--