ODBC is handig als u een standaardadapter wilt die een vergelijkbare API voor verschillende databases spreekt. Persoonlijk vind ik het een vreselijke API, maar het wordt algemeen begrepen en goed gedocumenteerd.
libpq praat directer met PostgreSQL. Je kunt er betere prestaties mee krijgen, maar waarschijnlijk niet genoeg meer dat het enig verschil zal maken voor de meeste apps, die tijd besteden aan het uitvoeren van query's, netwerklatentie, enz., niet in de clientbibliotheek.
Nieuwere versies van psqlODBC zijn gebouwd op libpq en dienen als een ODBC-wrapper voor libpq.
Er is ook libdbi, dat een minder gruwelijke API biedt dan ODBC.
Voor de volledigheid is er ook de server-backend SPI, die kan worden gebruikt door door de gebruiker gedefinieerde functies die in C zijn geschreven en in de PostgreSQL-server worden geladen. Het is niet nuttig buiten serverextensies en -functies.
Oh, en er is ecpg. Gebruik geen ecpg. Het is een super-legacy taal-geïntegreerde SQL-tool die voornamelijk bestaat om gemakkelijker over te zetten vanuit bepaalde andere database-engines. Gebruik geen ecpg. Echt.
Voor C++ is er de QtSQL-interface (ongewoon voor Qt, het is verschrikkelijk en pijnlijk beperkt, gebruik het niet) en libpq++ (OK, maar grotendeels niet onderhouden).
Persoonlijk schrijf ik libpq-code rechtstreeks, maar dat komt omdat ik aan code werk die meestal zelf in PostgreSQL gaat. Als je je niet kunt voorstellen ooit iets anders te willen targeten dan PostgreSQL, wil je misschien libpq-code schrijven; gebruik anders waarschijnlijk ODBC met psqlODBC.