BI Consult Desktop Logo BI Consult Mobile Logo
  • Russian BI Исследование российских bi
  • Перейти на Fine BI
  • Контакты
  • +7 812 334-08-01
    +7 499 608-13-06
  • Отправить сообщение
  • Главная
  • Продукты Эксперт-BI
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Сельское хозяйство
    • Энергетика
    • FMCG
    • Девелоперы
    • Маркетплейсы
    • Пищевая промышленность
    • Фармацевтика
    • Построение Data Platform
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и FP&A
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • IBP
    • ИТ (CIO)
    • Закупки
  • Платформы
    • Системы бизнес-анализа (BI)
    • Интегрированное бизнес-планирование (IBP)
    • Хранилища данных (DWH / Lakehouse)
    • Каталоги данных (Data Catalog)
    • Системы ETL и ELT
    • AI / Исскуственный интеллект
    • Шина данных (ESB)
    • Система управления мастер-данными (MDM)
    • Семантический слой
  • Услуги
    • Переход на отечественные BI и DWH системы
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений и DWH
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Курсы
    • Учебный курс Информационная грамотность (Data Literacy)
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Greenplum
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt (Data Build Tool)
  • Компания
    • Руководство
    • Новости
    • Клиенты
    • Карьера
    • Скачать
    • Контакты

BI

  • FineBI
  • FineReport
  • FineDataLink
  • FineChatBI (FineAI)
  • Коннекторы данных из 1С в BI
  • Airflow / Nifi
  • Visiology
  • PIX BI
  • Modus BI
  • Yandex.DataLens
  • Open-source BI: Superset/Metabase
  • Luxms BI
  • AW BI + Alpha BI
  • FlyBI + Форсайт. Аналитическая Платформа
  • Loginom
  • Триафлай
  • AI / Исскуственный интеллект
  • Optimacros
  • Навигатор BI
  • Семантический слой

СУБД

  • Arenadata
  • ClickHouse
  • Greenplum
  • Postgres Professional
  • TData

Другое

  • Построение Data Platform
    • Аналитическое хранилище данных
    • Data Lake и Data Engineering
    • Подробнее про Data Lake
    • Внедрение Lakehouse
      • Apache Doris
      • StarRocks
      • Trino
    • Миграция витрин из пропиетарных DWH на новый стек
    • Учебный курс "Современная архитектура хранилища данных"
Главная » Курсы по системам бизнес-анализа и методологии » Учебный курс по PostgreSQL » Руководство по PostgreSQL » PostgreSQL - Интерфейс C/C++

PostgreSQL - Интерфейс C/C++

В данном разделе мы будем использовать библиотеку libpqxx, являющуюся клиентским API для PostgreSQL, написанным на языке С++. Исходный код libpqxx доступен под лицензией BSD, поэтому Вы можете свободно загружать его, передавать другим, изменять, продавать, включать в свой собственный код и делиться изменениями с другими пользователями на Ваше усмотрение.

 

Установка

Последнюю версию библиотеки libpqxx можно скачать по ссылке Download Libpqxx. Скачайте ее и выполните следующие шаги:

wget http://pqxx.org/download/software/libpqxx/libpqxx-4.0.tar.gz
tar xvfz libpqxx-4.0.tar.gz
cd libpqxx-4.0
./configure
make
make install

 

Перед началом использования интерфейса C/C++ для PostgreSQL найдите файл pg_hba.conf в каталоге установки PostgreSQL и добавьте следующую линию:

# IPv4 local connections:
host    all         all         127.0.0.1/32          md5

 

Вы можете перезагрузить сервер postgres, если он еще не запущен, при помощи следующей команды:

[root@host]# service postgresql restart
Stopping postgresql service:                               [  OK  ]
Starting postgresql service:                               [  OK  ]

 


Для коммерческого использования:

  • Arenadata DB (ADB) – масштабируемое хранилище корпоративных данных, использующее массовую параллельную обработку и построенное на базе СУБД Greenplum с открытым исходным кодом Предназначен для хранения, обработки и анализа больших объемов структурированных и полуструктурированных данных – до десятков петабайт. 

  • Postgres Pro – российская коммерческая СУБД, разработанная компанией Postgres Professional с использованием СУБД PostgreSQL с открытым исходным кодом, которая использует и расширяет язык SQL в сочетании со многими функциями, позволяющими безопасно хранить и масштабировать самые сложные рабочие нагрузки данных, но значительно переработанная для соответствия требованиям корпоративных заказчиков. 

 

API C/C++

Ниже приведены важные подпрограммы интерфейса, необходимые для работы с базой данных PostgreSQL из Вашей программы C/C++. Если Вы ищете более сложное приложение, тогда рекомендуем Вам изучить официальную документацию libpqxx или использовать коммерчески доступные API.

 

S. No.

API и Описание

1

pqxx::connection C( const std::string & dbstring )

Это typedef, который будет использоваться для подключения к базе данных. Здесь dbstring предоставляет необходимые параметры для подключения к базе данных, например, dbname = testdb user = postgres password=pass123 hostaddr=127.0.0.1 port=5432.

 

Если подключение установлено успешно, он создает C с объектом подключения, который предоставляет различные полезные функции.

2

C.is_open()

Метод is_open() вернет 1, если файл найден и успешно открыт. Иначе вернет 0 и сработает код прописанный в блоке else. Если файл не открыт – желательно обработать ошибку. Как правило, если вся работа программы связана с файлом, пишут некое сообщение в консоль, и ставят выход из программы.

3

C.disconnect()

Данный метод используется для отключения от соединения с открытой базой данных.

4

pqxx::work W( C )

Это typedef, который будет использоваться для создания транзакционного объекта с использованием соединения C, который в конечном итоге будет использоваться для выполнения операторов SQL в транзакционном режиме.

 

Если объект транзакции создан успешно, он присваивается переменной W, которая будет использоваться для доступа к общедоступным методам, связанным с транзакционным объектом.

5

W.exec(const std::string & sql)

Данный метод используется для выполнения команды SQL.

6

W.commit()

Данный метод используется для подтверждения транзакции.

7

W.abort()

Данный метод используется для того, чтобы откатить транзакцию назад.

8

pqxx::nontransaction N( C )

Это typedef, который используется для создания нетранзакционного объекта с использованием соединения C, который в конечном итоге будет использоваться для выполнения операторов SQL в нетранзакционном режиме.

 

Если объект транзакции создан успешно, он присваивается переменной N, которая будет использоваться для доступа к общедоступным методам, связанным с нетранзакционным объектом.

9

N.exec(const std::string & sql)

Этот общедоступный метод используется для выполнения оператора SQL и возвращает объект результата, который на самом деле является интегратором, содержащим все возвращаемые записи.

 

Подключение к базе данных

Следующие сегменты кода C показывают, как подключиться к существующей базе данных, открытой на компьютере через порт 5432. В данном случае используется обратный слеш \ для продолжения линии.

#include <iostream>
#include <pqxx/pqxx> 
 
using namespace std;
using namespace pqxx;
 
int main(int argc, char* argv[]) {
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
      C.disconnect ();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
}

 

Теперь давайте скомпилируем и запустим указанную выше программу для подключения к нашей базе данных testdb, к которой можно получить доступ с помощью имени пользователя postgres и пароля pass123.

Вы можете использовать логин и пароль в зависимости от настроек Вашей базы данных. Не забудьте сохранить -lpqxx и -lpq в указанном порядке! В противном случае компоновщик будет ругаться из-за отсутствия функций с именами, начинающимися с «PQ».

$g++ test.cpp -lpqxx -lpq
$./a.out
Opened database successfully: testdb

 

Создание таблицы

Следующий сегмент кода C используется для создания таблицы в предварительно созданной базе данных:

#include <iostream>
#include <pqxx/pqxx> 
 
using namespace std;
using namespace pqxx;
 
int main(int argc, char* argv[]) {
   char * sql;
   
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
 
      /* Create SQL statement */
      sql = "CREATE TABLE COMPANY("  \
      "ID INT PRIMARY KEY     NOT NULL," \
      "NAME           TEXT    NOT NULL," \
      "AGE            INT     NOT NULL," \
      "ADDRESS        CHAR(50)," \
      "SALARY         REAL );";
 
      /* Create a transactional object. */
      work W(C);
      
      /* Execute SQL query */
      W.exec( sql );
      W.commit();
      cout << "Table created successfully" << endl;
      C.disconnect ();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
 
   return 0;

 

Когда выше описанная программа скомпилирована и выполнена, появится таблица COMPANY в Вашей базе данных testdb, и Вы увидите следующие уведомления:

Opened database successfully: testdb
Table created successfully

 

Операция INSERT

Следующий сегмент кода С показывает, как создать записи в таблице COMPANY:

#include <iostream>
#include <pqxx/pqxx> 
 
using namespace std;
using namespace pqxx;
 
int main(int argc, char* argv[]) {
   char * sql;
   
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
 
      /* Create SQL statement */
      sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
         "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
         "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "     \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
 
      /* Create a transactional object. */
      work W(C);
      
      /* Execute SQL query */
      W.exec( sql );
      W.commit();
      cout << "Records created successfully" << endl;
      C.disconnect ();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
 
   return 0;
}

 

Когда описанная выше программа скомпилирована и выполнена, она создаст введенные записи в таблицу COMPANY, и Вы увидите следующие уведомления:

Opened database successfully: testdb
Records created successfully

 

Операция SELECT

Следующий сегмент кода С показывает, как мы  выбираем и отображаем записи из созданной таблицы COMPANY:

#include <iostream>
#include <pqxx/pqxx> 
 
using namespace std;
using namespace pqxx;
 
int main(int argc, char* argv[]) {
   char * sql;
   
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
 
      /* Create SQL statement */
      sql = "SELECT * from COMPANY";
 
      /* Create a non-transactional object. */
      nontransaction N(C);
      
      /* Execute SQL query */
      result R( N.exec( sql ));
      
      /* List down all the records */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Name = " << c[1].as<string>() << endl;
         cout << "Age = " << c[2].as<int>() << endl;
         cout << "Address = " << c[3].as<string>() << endl;
         cout << "Salary = " << c[4].as<float>() << endl;
      }
      cout << "Operation done successfully" << endl;
      C.disconnect ();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
 
   return 0;

 

Как только вышеописанная программа скомпилирована и выполнена, она выдаст следующий результат:

Opened database successfully: testdb
ID = 1
Name = Paul
Age = 32
Address = California
Salary = 20000
ID = 2
Name = Allen
Age = 25
Address = Texas
Salary = 15000
ID = 3
Name = Teddy
Age = 23
Address = Norway
Salary = 20000
ID = 4
Name = Mark
Age = 25
Address = Rich-Mond
Salary = 65000
Operation done successfully

 

Операция UPDATE

Следующий сегмент кода С показывает, как использовать  UPDATE для обновления выделенных записей в таблице COMPANY и их отображения:

#include <iostream>
#include <pqxx/pqxx>
 
using namespace std;
using namespace pqxx;
 
int main(int argc, char* argv[]) {
   char * sql;
  
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
     
      /* Create a transactional object. */
      work W(C);
      /* Create  SQL UPDATE statement */
      sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1";
      /* Execute SQL query */
      W.exec( sql );
      W.commit();
      cout << "Records updated successfully" << endl;
     
      /* Create SQL SELECT statement */
      sql = "SELECT * from COMPANY";
 
      /* Create a non-transactional object. */
      nontransaction N(C);
     
      /* Execute SQL query */
      result R( N.exec( sql ));
     
      /* List down all the records */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Name = " << c[1].as<string>() << endl;
         cout << "Age = " << c[2].as<int>() << endl;
         cout << "Address = " << c[3].as<string>() << endl;
         cout << "Salary = " << c[4].as<float>() << endl;
      }
      cout << "Operation done successfully" << endl;
      C.disconnect ();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
 
   return 0;
}

 

Как только вышеописанная таблица скомпилирована и выполнена, она выдаст следующий результат:

Opened database successfully: testdb
Records updated successfully
ID = 2
Name = Allen
Age = 25
Address = Texas
Salary = 15000
ID = 3
Name = Teddy
Age = 23
Address = Norway
Salary = 20000
ID = 4
Name = Mark
Age = 25
Address = Rich-Mond
Salary = 65000
ID = 1
Name = Paul
Age = 32
Address = California
Salary = 25000
Operation done successfully

 

Операция DELETE

Следующий сегмент кода С показывает, как используется DELETE для удаления каких-либо записей из таблицы  COMPANY и отображения оставшихся в таблице записей:

#include <iostream>
#include <pqxx/pqxx> 
 
using namespace std;
using namespace pqxx;
 
int main(int argc, char* argv[]) {
   char * sql;
   
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
      
      /* Create a transactional object. */
      work W(C);
      /* Create  SQL DELETE statement */
      sql = "DELETE from COMPANY where ID = 2";
      /* Execute SQL query */
      W.exec( sql );
      W.commit();
      cout << "Records deleted successfully" << endl;
      
      /* Create SQL SELECT statement */
      sql = "SELECT * from COMPANY";
 
      /* Create a non-transactional object. */
      nontransaction N(C);
      
      /* Execute SQL query */
      result R( N.exec( sql ));
      
      /* List down all the records */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Name = " << c[1].as<string>() << endl;
         cout << "Age = " << c[2].as<int>() << endl;
         cout << "Address = " << c[3].as<string>() << endl;
         cout << "Salary = " << c[4].as<float>() << endl;
      }
      cout << "Operation done successfully" << endl;
      C.disconnect ();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
 
   return 0;
}

 

Как только вышеописанная программа скомпилирована и выполнена, она выдаст следующий результат:

Opened database successfully: testdb
Records deleted successfully
ID = 3
Name = Teddy
Age = 23
Address = Norway
Salary = 20000
ID = 4
Name = Mark
Age = 25
Address = Rich-Mond
Salary = 65000
ID = 1
Name = Paul
Age = 32
Address = California
Salary = 25000
Operation done successfully

 

Узнать стоимость решенияЗапросить видео презентацию

← Предыдущая статья
PostgreSQL – Полезные функции
Следующая статья →
PostgreSQL – Интерфейс JAVA

Решения

Анализировать ФинансыУвеличивайте ПродажиОптимальный Склад и ЛогистикаМаркетинговые Метрики

Клиенты
  • С объединением компании Savencia Fromage & Dairy и молочного комбината в г.Белебей, одного из лидеров по производству твердых сычужных сыров в России, Savencia выходит на российский рынок не только как импортер, но и как производитель молочной продукции.

  • Компания «Бизон-Трейд» является официальным дилером ведущих мировых производителей сельскохозяйственной техники (Fendt, Valtra, Lemken и др.) на Юге России. Входит в состав агрохолдинга «Бизон», основанного в 1994 году. Имеет 8 филиалов в Краснодарском и Ставропольском краях, Ростовской области.

  • AbbVie – компания, которая стремится решить самые серьезные проблемы здравоохранения. Это биофармацевтическая компания, сфокусированная на исследованиях и разработках.

  • АО «НСПК» - оператор национальной системы платежных карт, который предоставляет операционные услуги и услуги платежного клиринга операторам платежных систем, в том числе Банку России и кредитным организациям. В задачи АО «НСПК» входит обеспечение бесперебойного доступа к переводам денежных средств в Российской Федерации с использованием платежных инструментов.  Также компания является оператором национальной платёжной системы «Мир» и операционным и платёжным клиринговым центром Системы быстрых платежей (СБП).

  • Решения
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Энергетика
    • Фармацевтика
  • Услуги
    • Переход на отечественные BI и DWH
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Техническая поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Платформы
    • FineBI
    • FineReport
    • FineDataLink
    • Коннекторы данных из 1С в BI
    • Airflow + NiFi
    • Visiology
    • Luxms BI
    • Modus BI
    • PIX BI
    • Arenadata
    • ClickHouse
    • Greenplum
    • Postgres Professional
    • Open-source BI: Superset/Metabase
    • Loginom
    • Yandex.DataLens
    • AI / Исскуственный интеллект
    • Optimacros
    • Шины данных
  • Курсы
    • Учебный курс Информационная грамотность
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt
  • Функциональные решения
    • Создание Data Lake
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и прогнозная аналитика
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • Сквозная аналитика
  • Компания
    • О нас
    • Руководство
    • Новости
    • Клиенты
    • Скачать
    • Контакты
    • Политика конфиденциальности
RutubeVkontakteLinkedInYouTube
ООО "Би Ай Консалт",
ИНН: 7811437757,
ОГРН: 1097847154184
199178, Россия,
Санкт-Петербург,
6-ая линия В.О., Д. 63, 4 этаж
Тел: +7 (812) 334-08-01
Тел: +7 (499) 608-13-06
E-mail: info@biconsult.ru

 

 

 

 

 

×

Пользуясь сайтом, вы соглашаетесь с использованием cookies и политикой конфиденциальности.