ODBC è utile se si desidera un adattatore standard che parli di un'API simile per database diversi. Personalmente penso che sia un'API terribile, ma è ampiamente compresa e ben documentata.
libpq parla più direttamente con PostgreSQL. Puoi ottenere prestazioni migliori con esso, ma probabilmente non abbastanza da fare la differenza per la maggior parte delle app, che dedicano tempo all'esecuzione di query, alla latenza di rete, ecc., Non nella libreria del client.
Le versioni più recenti di psqlODBC sono basate su libpq e fungono da wrapper ODBC per libpq.
C'è anche libdbi, che offre un'API meno orribile di ODBC.
Per completezza, c'è anche la SPI server-back-end, che può essere utilizzata da funzioni definite dall'utente scritte in C e caricate nel server PostgreSQL. Non è utile al di fuori delle estensioni e delle funzioni del server.
Oh, e c'è l'ecpg. Non usare l'ecpg. È uno strumento SQL integrato nel linguaggio super legacy che esiste principalmente per semplificare il porting da alcuni altri motori di database. Non usare l'ecpg. Davvero.
Per C++ c'è l'interfaccia QtSQL (insolitamente per Qt, è orribile e dolorosamente limitato, non usarlo) e libpq++ (OK ma in gran parte non mantenuto).
Personalmente scrivo direttamente il codice libpq, ma è perché sto lavorando su un codice che di solito va in PostgreSQL da solo. Se non riesci a immaginare di voler puntare su qualcosa tranne PostgreSQL, potresti voler scrivere il codice libpq; altrimenti probabilmente usa ODBC con psqlODBC.