ODBC ist nützlich, wenn Sie einen Standardadapter wünschen, der eine ähnliche API für verschiedene Datenbanken spricht. Ich persönlich finde, dass es sich um eine schreckliche API handelt, aber sie ist allgemein bekannt und gut dokumentiert.
libpq kommuniziert direkter mit PostgreSQL. Sie können damit eine bessere Leistung erzielen, aber wahrscheinlich nicht genug mehr, um einen Unterschied für die meisten Apps zu machen, die Zeit für die Ausführung von Abfragen, Netzwerklatenz usw. und nicht in der Client-Bibliothek aufwenden.
Neuere Versionen von psqlODBC bauen auf libpq auf und dienen als ODBC-Wrapper für libpq.
Es gibt auch libdbi, das eine weniger grässliche API als ODBC bietet.
Der Vollständigkeit halber gibt es auch das Server-Backend-SPI, das von benutzerdefinierten Funktionen verwendet werden kann, die in C geschrieben und in den PostgreSQL-Server geladen werden. Es ist außerhalb von Servererweiterungen und -funktionen nicht nützlich.
Oh, und es gibt ecpg. Verwenden Sie kein ecg. Es ist ein Super-Legacy-SQL-Tool mit integrierter Sprache, das hauptsächlich für die einfachere Portierung von bestimmten anderen Datenbank-Engines existiert. Verwenden Sie kein ecg. Wirklich.
Für C++ gibt es die QtSQL-Schnittstelle (ungewöhnlich für Qt, sie ist schrecklich und schmerzlich eingeschränkt, verwenden Sie sie nicht) und libpq++ (OK, aber weitgehend ungepflegt).
Persönlich schreibe ich libpq-Code direkt, aber das liegt daran, dass ich an Code arbeite, der normalerweise in PostgreSQL selbst eingefügt wird. Wenn Sie sich nicht vorstellen können, jemals auf etwas anderes als PostgreSQL abzielen zu wollen, sollten Sie vielleicht libpq-Code schreiben; Andernfalls verwenden Sie wahrscheinlich ODBC mit psqlODBC.