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

Новини После крупнейшей солнечной электростанции Китай строит еще более мощный объект

После крупнейшей солнечной электростанции Китай строит еще более мощный объект

05.07.202428.06.2025

Прошло чуть больше месяца с запуска крупнейшей в мире солнечной электростанции в Китае, обладающей мощностью в 5 гигаватт. Но уже сейчас стало известно, что Китай приступил к строительству новой электростанции, которая будет еще мощнее.

Read More
Новини Уряд Великобританії надає Jaguаr Land Rover кредит у розмірі 1,5 мільярда фунтів після кібератаки, що затримала виробництво автомобілів на кілька тижнів

Уряд Великобританії надає Jaguаr Land Rover кредит у розмірі 1,5 мільярда фунтів після кібератаки

30.09.202501.10.2025

Уряд Великобританії підтвердив, що гарантує кредит у розмірі £1,5 мільярда ($2 мільярди) для автомобілебудівної компанії Jaguar Land Rover, після того як хакерська атака призвела до зупинки виробничих ліній і поставила під загрозу банкрутство постачальників. У недільній заяві представники уряду зазначили, що підтримуваний державою кредит “підтримає фінансові резерви JLR, щоб компанія…

Read More
Новини Новый робот в Барселоне: заряд электромобилей доступен везде

Новый робот в Барселоне: заряд электромобилей доступен везде

13.05.202428.06.2025

На одной из стоянок в Барселоне, Испания, появился инновационный мобильный аппарат, который передвигается на колесах и призван обеспечивать зарядку электромобилей.

Read More

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

  • У бета-версії iOS 27 Siri навчилася говорити швидше, повільніше та виразніше
  • Google випустила Gemini Spark для macOS
  • SpaceX працює над власним ШІ-пристроєм: чи так це насправді
  • Топ бюджетних смартфонів 2026: моделі, ціни, характеристики
  • Україна представить три дисципліни без кваліфікації на Esports Nations Cup 2026

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

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

Категории

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