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

Новини Samsung планирует представить функцию "Battery AI"

Samsung планирует представить функцию «Battery AI»

12.05.202428.06.2025

Samsung планирует представить функцию «Battery AI» до выпуска линейки Galaxy S25 в следующем году, и она будет совместима с ранними моделями.

Read More
Новини YouTube закрывает доступ к Premium для части пользователей: кого это коснется

YouTube закрывает доступ к Premium для части пользователей: кого это коснется

21.06.202428.06.2025

Платформа YouTube начала отменять премиум-подписки, если страна регистрации не совпадает с реальным местонахождением пользователя.

Read More
Наука та космос Китай запускает мегапроект: создание глобальной сети интернета из 15 000 спутников

Китай запускает мегапроект: создание глобальной сети интернета из 15 000 спутников

05.07.202428.06.2025

Китай приступает к созданию обширного спутникового созвездия G60 Qianfan на низкой околоземной орбите (LEO).

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