Учебники

PostgreSQL — интерфейс C / C ++

В этом руководстве будет использоваться библиотека libpqxx , которая является официальным клиентским API C ++ для 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  ]

API интерфейса C / C ++

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

С. Нет. API и описание
1

pqxx :: соединение C (const std :: string & dbstring)

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

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

2

C.is_open ()

Метод is_open () является открытым методом объекта соединения и возвращает логическое значение. Если соединение активно, то этот метод возвращает true, в противном случае он возвращает false.

3

C.disconnect ()

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

4

pqxx :: работа W (C)

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

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

5

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

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

6

W.commit ()

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

7

W.abort ()

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

8

pqxx :: нетранзакция N (C)

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

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

9

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

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

pqxx :: соединение C (const std :: string & dbstring)

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

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

C.is_open ()

Метод is_open () является открытым методом объекта соединения и возвращает логическое значение. Если соединение активно, то этот метод возвращает true, в противном случае он возвращает false.

C.disconnect ()

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

pqxx :: работа W (C)

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

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

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

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

W.commit ()

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

W.abort ()

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

pqxx :: нетранзакция N (C)

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

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

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

ВСТАВИТЬ Операция

Следующий сегмент кода C показывает, как мы можем создавать записи в нашей таблице 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

ВЫБЕРИТЕ Операцию

Следующий сегмент кода C показывает, как мы можем получать и отображать записи из нашей таблицы 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

ОБНОВЛЕНИЕ Операция

Следующий сегмент кода C показывает, как мы можем использовать инструкцию 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

УДАЛЕНИЕ Операция

Следующий сегмент кода C показывает, как мы можем использовать инструкцию 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;
}

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