Быстрый старт

Сервис транзакционной СУБД (услуга 1.1) - система управления базами данных, основанная на PostgreSQL. В этом разделе приведена информация, необходимая для разработки приложений, подключаемых к Сервису.
Сервис транзакционной СУБД может использоваться как СУБД широкого профиля и выполнять любые задачи, стоящие перед современными системами хранения и обработки данных. Вместе с тем, функциональные особенности системы, такие как расширенные средства обеспечения безопасности, контроля доступа и защиты пользовательских данных, превращают Сервис в надежное решение для сфер деятельности, где конфиденциальность и сохранность данных имеют первостепенное значение, а их утрата или кража могут обернуться катастрофическими финансовыми, репутационными потерями и даже привести к уголовной ответственности.
Внедрение Сервиса транзакционной СУБД повышает уровень безопасности обрабатываемой информации и снижает риски ее хищения или утраты.

Подключение и конфигурирование

В рамках данного руководства среда будет подготовлена к разработке приложения на языке C++ с использованием компилятора gcc и интерфейсной библиотеки libpqxx. Эти инструменты выбраны в качестве примера, разработчик может использовать любые доступные ему комбинации.
  1. Установите СУБД Сервиса и подготовьте ее к работе.
  2. Установите gcc (компилятор языка C, который потребуется для сборки компонентов среды разработки и для компиляции непосредственно программ на языке C). Для этого выполните следующую команду в терминале:
    sudo apt-get install gcc
  3. Установите libpq-dev. Пакет libpq-dev содержит заголовочные файлы и статическую библиотеку для компиляции программ на C с использованием библиотеки libpq, которая отвечает за взаимодействие с серверной частью Сервиса транзакционной СУБД.
    sudo apt-get install libpq-dev
  4. Загрузите и установите актуальную версию libpqxx. В этом руководстве для разработки первого приложения будет использоваться open-source библиотека libpqxx - официальный C++ API для PostgreSQL, полностью совместимый с Сервисом транзакционной СУБД.

    4.1 Загрузите и установите актуальную версию libpqxx. Для этого выполните в терминале:
    Terminal_Console type=sh
    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
    
    4.2 Откройте файл pg_hba.conf в директории Сервиса и добавьте в него следующую строку:
    pg_hba.conf type=sh
    ## IPv4 local connections:
    host    all         all         127.0.0.1/32          md5
    
    4.3 Перезапустите Сервис.
    Terminal_Console type=sh
    [root@host]# service postgresql restart
    Stopping postgresql service:                               [  OK  ]
    Starting postgresql service:                               [  OK  ]
    

Разработка первого приложения

В этом разделе описывается разработка приложений, взаимодействующих с СУБД Сервиса.
Для выполнения определенных команд могут потребоваться права на подключение к БД и набор прав для работы с данными (DDL, DML). Убедитесь, что у вашей учетной записи есть необходимые права доступа или войдите в систему под учетной записью, у которой такие права предоставлены (например, postgres).
  1. Создайте тестовую базу данных testdb, с которой будет работать приложение. Для этого запустите интерфейс командной строки Сервиса транзакционной СУБД (psql) и выполните команду:
    CREATE DATABASE testdb;
  2. Убедитесь, что новая база данных создана. В интерфейсе командной строки Сервиса транзакционной СУБД выполните команду \l. Вы увидите примерно следующее:
    Console type=sh
    postgres-# \l
                                 List of databases
       Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges
    -----------+----------+----------+---------+-------+-----------------------
     postgres  | postgres | UTF8     | C       | C     |
     template0 | postgres | UTF8     | C       | C     | =c/postgres          +
               |          |          |         |       | postgres=CTc/postgres
     template1 | postgres | UTF8     | C       | C     | =c/postgres          +
               |          |          |         |       | postgres=CTc/postgres
     testdb    | postgres | UTF8     | C       | C     |
    (4 rows)
    postgres-#
    
  3. Выполните подключение к базе данных на локальной машине через порт 5433 от имени пользователя postgres.
    Connecting type=sh
    ##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 = <пароль> \
          hostaddr = 127.0.0.1 port = 5433");
          if (C.is_open()) {
            cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl;
          } else {
            cout << "Не удаётся установить подключение к базе данных." << endl;
            return 1;
          }
          C.disconnect ();
       } catch (const std::exception &e) {
          cerr << e.what() << std::endl;
          return 1;
       }
    }
    
  4. Скомпилируйте программу и выполните ее.
    Console type=sh
    $ gсс test.cpp -lpqxx -lpq
    $ ./a.out
    Подключение к базе данных testdb установлено.
    

Работа с таблицами

Ниже приведены примеры кода для работы с таблицами:

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

Создание таблицы MYSTORE в базе данных testdb:
Create type=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 = <пароль> \
      hostaddr = 127.0.0.1 port = 5433");
      if (C.is_open()) {
         cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl;
      } else {
         cout << "Не удаётся установить подключение к базе данных." << endl;
         return 1;
      }

      /* Создать инструкцию SQL */
      sql = "CREATE TABLE MYSTORE("  \
      "ID INT PRIMARY KEY     NOT NULL," \
      "ТИП            TEXT    NOT NULL," \
      "ЦВЕТ           TEXT    NOT NULL," \
      "МАТЕРИАЛ       TEXT    NOT NULL," \
      "ЗАПАС          INT," \
      "ЦЕНА           REAL );";

      /* Создать транзакционный объект */
      work W(C);

      /* Выполнить SQL-запрос */
      W.exec( sql );
      W.commit();
      cout << "Таблица создана успешно" << endl;
      C.disconnect ();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }

   return 0;
}
Результат компиляции и выполнения программы:
Console type=sh
$ gсс test.cpp -lpqxx -lpq
$ ./a.out
Подключение к базе данных testdb установлено.
Таблица создана успешно

Операция INSERT

Cоздание записи в таблице MYSTORE:
Insert type=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 = <пароль> \
      hostaddr = 127.0.0.1 port = 5433");
      if (C.is_open()) {
         cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl;
      } else {
         cout << "Не удаётся установить подключение к базе данных." << endl;
         return 1;
      }

      /* Создать инструкцию SQL */
      sql = "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) "  \
         "VALUES (1, 'Футболка', 'Синий', 'Хлопок', 500, 2000.00 ); " \
         "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) "  \
         "VALUES (2, 'Футболка', 'Желтый', 'Хлопок', 500, 2000.00 ); " \
         "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) "  \
         "VALUES (3, 'Футболка', 'Красный', 'Хлопок', 500, 2000.00 ); " \
         "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) "  \
         "VALUES (4, 'Рубашка', 'Синий', 'Шелк', 400, 2500.00 ); " \
         "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) "  \
         "VALUES (5, 'Рубашка', 'Белый', 'Хлопок', 600, 1400.00 ); " \
         "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) "  \
         "VALUES (6, 'Свитер', 'Синий', 'Шерсть', 100, 4000.00 ); " \
         "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) "  \
         "VALUES (7, 'Футболка', 'Синий', 'Нейлон', 500, 1000.00 ); "; \

      /* Создать транзакционный объект */
      work W(C);

      /* Выполнить SQL-запрос */
      W.exec( sql );
      W.commit();
      cout << "Записи созданы успешно." << endl;
      C.disconnect ();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }

   return 0;
}
Результат компиляции и выполнения программы:
Console type=sh
$ gсс test.cpp -lpqxx -lpq
$ ./a.out
Подключение к базе данных testdb установлено.
Записи созданы успешно.

Операция SELECT

Вывод на экран записи из таблицы MYSTORE:
Select type=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 = <пароль> \
      hostaddr = 127.0.0.1 port = 5433");
      if (C.is_open()) {
         cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl;
      } else {
         cout << "Не удаётся установить подключение к базе данных." << endl;
         return 1;
      }

      /* Создать инструкцию SQL */
      sql = "SELECT * from MYSTORE";

      /* Создать нетранзакционный объект */
      nontransaction N(C);

      /* Выполнить SQL-запрос */
      result R( N.exec( sql ));

      /* Вывести записи */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Тип = " << c[1].as<string>() << endl;
         cout << "Цвет = " << c[2].as<string>() << endl;
         cout << "Материал = " << c[3].as<string>() << endl;
         cout << "Запас = " << c[4].as<int>() << endl;
         cout << "Цена = " << c[5].as<float>() << endl;
         cout << endl;
      }
      cout << "Операция выполнена успешно." << endl;
      C.disconnect ();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }

   return 0;
}
Результат компиляции и выполнения программы:
Console type=sh
$ gсс test.cpp -lpqxx -lpq
$ ./a.out
Подключение к базе данных testdb установлено.
ID = 1
Тип = Футболка
Цвет = Синий
Материал = Хлопок
Запас = 500
Цена = 2000

ID = 2
Тип = Футболка
Цвет = Желтый
Материал = Хлопок
Запас = 500
Цена = 2000

ID = 3
Тип = Футболка
Цвет = Красный
Материал = Хлопок
Запас = 500
Цена = 2000

ID = 4
Тип = Рубашка
Цвет = Синий
Материал = Шелк
Запас = 400
Цена = 2500

ID = 5
Тип = Рубашка
Цвет = Белый
Материал = Хлопок
Запас = 600
Цена = 1400

ID = 6
Тип = Свитер
Цвет = Синий
Материал = Шерсть
Запас = 100
Цена = 4000

ID = 7
Тип = Футболка
Цвет = Синий
Материал = Нейлон
Запас = 500
Цена = 1000

Операция выполнена успешно.

Операция UPDATE

Изменение данных в таблице MYSTORE и вывод на экран обновленных записей:
Update type=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 = <пароль> \
      hostaddr = 127.0.0.1 port = 5433");
      if (C.is_open()) {
         cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl;
      } else {
         cout << "Не удаётся установить подключение к базе данных." << endl;
         return 1;
      }

      /* Создать транзакционный объект */
      work W(C);

      /* Создать инструкцию SQL */
      sql = "UPDATE MYSTORE set ЦЕНА = 999.99 where МАТЕРИАЛ='Хлопок'";

      /* Выполнить SQL-запрос */
      W.exec( sql );
      W.commit();
      cout << "Записи изменены успешно" << endl;

      /* Создать инструкцию SQL */
      sql = "SELECT * from MYSTORE";

      /* Создать нетранзакционный объект */
      nontransaction N(C);

      /* Выполнить SQL-запрос */
      result R( N.exec( sql ));

      /* Вывести записи */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Тип = " << c[1].as<string>() << endl;
         cout << "Цвет = " << c[2].as<string>() << endl;
         cout << "Материал = " << c[3].as<string>() << endl;
         cout << "Запас = " << c[4].as<int>() << endl;
         cout << "Цена = " << c[5].as<float>() << endl;
         cout << endl;
      }
      cout << "Операция выполнена успешно." << endl;
      C.disconnect ();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }

   return 0;
}

Результат компиляции и выполнения программы:
Console type=sh
$ gсс test.cpp -lpqxx -lpq
$ ./a.out
Подключение к базе данных testdb установлено.
Записи обновлены успешно.
ID = 4
Тип = Рубашка
Цвет = Синий
Материал = Шелк
Запас = 400
Цена = 2500

ID = 6
Тип = Свитер
Цвет = Синий
Материал = Шерсть
Запас = 100
Цена = 4000

ID = 7
Тип = Футболка
Цвет = Синий
Материал = Нейлон
Запас = 500
Цена = 1000

ID = 1
Тип = Футболка
Цвет = Синий
Материал = Хлопок
Запас = 500
Цена = 999.99

ID = 2
Тип = Футболка
Цвет = Желтый
Материал = Хлопок
Запас = 500
Цена = 999.99

ID = 3
Тип = Футболка
Цвет = Красный
Материал = Хлопок
Запас = 500
Цена = 999.99

ID = 5
Тип = Рубашка
Цвет = Белый
Материал = Хлопок
Запас = 600
Цена = 999.99

Операция выполнена успешно.

Операция DELETE

Удаление данных из таблицы MYSTORE и вывод на экран обновленных записей:
Delete type=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 = <пароль> \
      hostaddr = 127.0.0.1 port = 5433");
      if (C.is_open()) {
         cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl;
      } else {
         cout << "Не удаётся установить подключение к базе данных." << endl;
         return 1;
      }

      /* Создать транзакционный объект */
      work W(C);

      /* Создать инструкцию SQL */
      sql = "DELETE from MYSTORE where МАТЕРИАЛ != 'Хлопок'";

      /* Выполнить SQL-запрос */
      W.exec( sql );
      W.commit();
      cout << "Записи изменены успешно." << endl;

      /* Создать инструкцию SQL */
      sql = "SELECT * from MYSTORE";

      /* Создать нетранзакционный объект */
      nontransaction N(C);

      /* Выполнить SQL-запрос */
      result R( N.exec( sql ));

      /* Вывести записи */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Тип = " << c[1].as<string>() << endl;
         cout << "Цвет = " << c[2].as<string>() << endl;
         cout << "Материал = " << c[3].as<string>() << endl;
         cout << "Запас = " << c[4].as<int>() << endl;
         cout << "Цена = " << c[5].as<float>() << endl;
         cout << endl;
      }
      cout << "Операция выполнена успешно." << endl;
      C.disconnect ();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }

   return 0;
}
Результат компиляции и выполнения программы:
Console type=sh
$ ./delete.out
Подключение к базе данных testdb установлено.
Записи изменены успешно.
ID = 1
Тип = Футболка
Цвет = Синий
Материал = Хлопок
Запас = 500
Цена = 999.99

ID = 2
Тип = Футболка
Цвет = Желтый
Материал = Хлопок
Запас = 500
Цена = 999.99

ID = 3
Тип = Футболка
Цвет = Красный
Материал = Хлопок
Запас = 500
Цена = 999.99

ID = 5
Тип = Рубашка
Цвет = Белый
Материал = Хлопок
Запас = 600
Цена = 999.99

Операция выполнена успешно.
Предыдущий раздел
1.1 Транзакционная СУБД (Цифровой продукт Тип 1)
Следующий раздел
Расширения
Была ли страница полезной?