ODBC er nyttig, hvis du vil have en standardadapter, der taler en lignende API til forskellige databaser. Jeg synes personligt, det er en forfærdelig API, men den er bredt forstået og veldokumenteret.
libpq taler mere direkte til PostgreSQL. Du kan få bedre ydeevne med det, men sandsynligvis ikke nok mere til, at det vil gøre nogen forskel for de fleste apps, som bruger tid på udførelse af forespørgsler, netværksforsinkelse osv., ikke i klientbiblioteket.
Nyere versioner af psqlODBC er bygget på libpq og fungerer som en ODBC-indpakning for libpq.
Der er også libdbi, som tilbyder en mindre uhyggelig API end ODBC.
For fuldstændighedens skyld er der også server-backend SPI, som kan bruges af brugerdefinerede funktioner skrevet i C og indlæst i PostgreSQL-serveren. Det er ikke nyttigt uden for serverudvidelser og -funktioner.
Åh, og der er ecpg. Brug ikke ecpg. Det er et super-legacy sprog-integreret-SQL-værktøj, der primært eksisterer for lettere portering fra visse andre databasemotorer. Brug ikke ecpg. Virkelig.
For C++ er der QtSQL-grænsefladen (usædvanligt for Qt, den er forfærdelig og smerteligt begrænset, brug den ikke) og libpq++ (OK, men stort set ikke vedligeholdt).
Personligt skriver jeg libpq-kode direkte, men det er fordi jeg arbejder på kode, der normalt går ind i PostgreSQL. Hvis du ikke kan forestille dig nogensinde at ville målrette mod noget undtagen PostgreSQL, vil du måske skrive libpq-kode; ellers sandsynligvis bruge ODBC med psqlODBC.