Skip to content
wel.org.ua
wel.org.ua

  • Новини
  • Криптовалюта
  • Додатки
  • iT
  • Штучний інтелект
  • Статті
wel.org.ua

[:ru]Работа с PostgreSQL из C/C++[:]

Наталія Кравець, 16.04.202428.06.2025
[:ru]

Разработаем приложение которое в последствии должно взаимодействовать с базой данных PostgreSQL. Есть две официальных клиентских C++ API для работы с PostgreSQL:
libpq++, libpqxx и SOCI PostgreSQL backend, с поддержкой PostgreSQL >= 7.3, версии старше 8.0. Они распространяются свободно, с открытым исходным кодом и «хорошо документированы» на английском языке.

Работа с библиотекой libpq++

create table people (
        id              integer,
        firstname       varchar(20),
        lastname        varchar(20),
        phonenumber     char(10)
);

insert into people (id, firstname, lastname, phonenumber) values
        (1, 'Вася', 'Пупкин', '5055551234');

insert into people (id, firstname, lastname, phonenumber) values
        (2, 'Лена', 'Похер', '5055551234');

insert into people (id, firstname, lastname, phonenumber) values
        (3, 'Серёжа', 'молодец', '5055554321');

Для этой программы для C++ использую библиотеку libpq что бы получить доступ в базу. Для C программиста лучше использовать родные С библиотеки через C++ libpq и эта библиотека очень доступна для на-С++ программита.

Компиляция:

g++ -lpq db.cpp -o db

Использование libpqxx

Вот несколько причин для выбора libpqxx:

  1. Согласованность с языком. Используются преимущества C++: шаблоны (templates), исключения (exceptions), различные итераторов.
    По возможности внутри юзается стандартные вещи из STL.
  2. Структура, позволяющая писать «хороший» код. В основном проблемы обнаруживаются
    на этапе компиляции или тестирования.
  3. Мощность. Встроенные фичи: автоматическое восстановление соединения и
    управление транзакциями освобождают разработчика.
  4. Гибкость. Код библиотеки живет в своем пространстве имен (pqxx)
    и полностью прячет нативный C API.
    Что нужно для libpqxx?Во-первых, необходима нативная libpq.so/libpq.dll.
    Во-вторых, сама libpqxx.so/libpqxx.dll.
#include 
#include 
#include 
#include 
#include 

void help()
{
   std::cout << "Использовать:    " << std::endl;
}

int main(int argc, char **argv)
{
   if (argc < 5) {
       help();
       return 1;
   }

   // Prepare connection string
   std::ostringstream conn_string("");
   conn_string << "host=" << argv[1]
       << " user=" << argv[2]
       << " password=" << argv[3]
       << " dbname=" << argv[4];

   do {
       // Create connection
       try {
           pqxx::connection conn(conn_string.str());
           pqxx::work       xact(conn, "SampleSelect");

           std::string      query("SELECT * from people limit 3");
           // Execute query
           try {
               pqxx::result res = xact.exec(query);
               if (!res.size()) {
                   std::cout << "Пустой вывод." << std::endl;
                   break;
               }
               // Show results
               for (pqxx::result::const_iterator i = res.begin(), r_end = res.end(); i != r_end; ++i) {
                   // Iterate fields
                   for (pqxx::result::const_fielditerator f = i->begin(), f_end = i->end(); f != f_end; ++f) {
                       std::cout << f->name() << " = '" << f->c_str() << "'" << std::endl;
                   }
                   std::cout << std::endl;
               }
           } catch (...) {
               std::cout << "Запрос не был выполнен: " << query << std::endl;
               break;
           }
       } catch (pqxx::broken_connection) {
           std::cout << "Ошибка: establish connection." << std::endl;
           break;
       }
       std::cout << "Запрос успешно выполнен." << std::endl;

       return 0;
   } while (false);

   return 1;
}

Makefile:

SRC=pqxx_sample.cpp
PROG=pqxx_sample

all:
 c++ ${SRC} -o ${PROG} `pkg-config --libs --cflags libpqxx`
clean:
 rm -f *.o ${PROG}
  1. libpq++ – libpqplusplus.html
  2. libpqxx – libpqxx
  3. Справочная информация – Reference
  4. std::ostringstream – ostringstream

Библиотека SOCI PostgreSQL backend поддерживает:

  1. Oracle
  2. PostgreSQL >= 7.3, версии старше 8.0
  3. MySQL
  4. (unsupported) backends exist in the CVS repository: ODBC, SQLite and Firebird.

Тестированные платформы

PostgreSQL версииОперационная системаКомпилятор
8.3Mac OS X 10.5.3g++ 4.0.1
8.3Mac OS X 10.5.3g++ 4.4.0
8.3FreeBSD 7.0g++ 4.2.1
8.3Linux i686 2.6.9 (RedHat family)g++ 3.4.6
8.2.7Linux i686 2.6.23 (Fedora release 7)g++ 4.1.2

Поддерживаемые backend-ы и поддерживаемые платформы

OraclePostgreSQLMySQLSQLite3FirebirdODBC
Binding by NameYESYES (>=8.0)YESYESYESYES
Dynamic BindingYESYESYESYESYESYES
Bulk OperationsYESYESYESYESYESYES
TransactionsYESYESYES
(with servers that support them, usually >= 4.0)
YESYESYES
BLOB Data TypeYESYESNONOYESNO
RowID Data TypeYESYESNONONONO
Nested StatementsYESNONONONONO
Stored ProceduresYESYESNO (but stored functions, YES)NOYESNO

Какие требуются клиентские библиотеки

SOCI PostgreSQL backend требует PostgreSQL’slibpqклиентскую библиотеку.

Пример:

#include "soci.h"
#include "soci-oracle.h"
#include 
#include 
#include 
#include 
#include 

using namespace soci;
using namespace std;

bool getName(string &name)
{
    cout << "Введите имя: ";
    return cin >> name;
}

int main()
{
    try
    {
        session sql(postgresql, "service=mydb user=john password=secret");

        int count;
        sql << "select count(*) from phonebook", into(count);

        cout << "У нас " << count << " записей в phonebook.\n";

        string name;
        while (getName(name))
        {
            string phone;
            indicator ind;
            sql << "select phone from phonebook where name = :name",
                into(phone, ind), use(name);

            if (ind == i_ok)
            {
                cout << "Телефонный номер: " << phone << '\n';
            }
            else
            {
                cout << "Нет телефонного номера: " << name << '\n';
            }
        }
    }
    catch (exception const &e)
    {
        cerr << "Ошибка: " << e.what() << '\n';
    }
}
[:]
Новини [:ru]Програмирование[:]

Навигация по записям

Previous post
Next post

Related Posts

Новини Amazon и Vrio запускают спутниковый интернет в Южной Америке

Amazon и Vrio запускают спутниковый интернет в Южной Америке

13.06.202428.06.2025

Amazon и Vrio объединяют усилия, чтобы предоставить спутниковый интернет в Южной Америке, конкурируя с Starlink Илона Маска.

Read More
Новини Увага! Вразливі дані з Harvard та UPenn потрапили до рук хакерів: як захистити себе від нових кіберзагроз

Вразливі дані з Harvard та UPenn потрапили до рук хакерів

27.03.202627.03.2026

Відоме хакерське угрупування ShinyHunters взяло на себе відповідальність за витік даних минулого року в університетах Гарвард та Пенсильванії, опублікувавши вкрадену інформацію на своєму сайті. За їхніми даними, з кожного з цих закладів було викрадено понад мільйон записів. У середу ShinyHunters оприлюднили дані, що, за їхніми словами, стосуються декількох баз даних…

Read More
Новини Попри тривалі труднощі з доступністю продуктів, UNFI повідомляє про відновлення після кібератаки

Попри тривалі труднощі з доступністю продуктів, UNFI повідомляє про відновлення після кібератаки

18.07.2025

Великий дистриб’ютор продуктів харчування United Natural Foods (UNFI) повідомив про «значний прогрес» у відновленні після кібернападу, що стався майже два тижні тому, оскільки продуктові магазини по всій Північній Америці, які покладаються на цього постачальника, продовжують стикатися з нестачею товарів. У неділю UNFI опублікував оновлення, зазначивши, що відновлює свої електронні системи…

Read More

Последние записи

  • Новий спосіб перемикання магнітної пам’яті зменшить енерговитрати ШІ
  • NAVI посіли четверте місце на Esports World Cup 2026
  • Кубок NAVI продемонструють фанатам у готелі Україна
  • Студія GSC та UNITED24 відкривають збір на розмінування ЧАЕС
  • S.T.A.L.K.E.R. 2 отримала перше сюжетне DLC

Последние коментарии

Нет комментариев для просмотра.

Категории

  • iT
  • Авто
  • Додатки
  • Ігри та кіно
  • Криптовалюта
  • Наука та космос
  • Новини
  • Пристрої
  • Статті
  • Штучний інтелект
©2026 wel.org.ua | WordPress Theme by SuperbThemes