Быстрый старт
Сервис транзакционной СУБД (услуга 1.1) - система управления базами данных, основанная на PostgreSQL. В этом разделе приведена информация, необходимая для разработки приложений, подключаемых к Сервису.
Сервис транзакционной СУБД может использоваться как СУБД широкого профиля и выполнять любые задачи, стоящие перед современными системами хранения и обработки данных. Вместе с тем, функциональные особенности системы, такие как расширенные средства обеспечения безопасности, контроля доступа и защиты пользовательских данных, превращают Сервис в надежное решение для сфер деятельности, где конфиденциальность и сохранность данных имеют первостепенное значение, а их утрата или кража могут обернуться катастрофическими финансовыми, репутационными потерями и даже привести к уголовной ответственности.
Внедрение Сервиса транзакционной СУБД повышает уровень безопасности обрабатываемой информации и снижает риски ее хищения или утраты.
В рамках данного руководства среда будет подготовлена к разработке приложения на языке C++ с использованием компилятора
gcc
и интерфейсной библиотеки libpqxx
. Эти инструменты выбраны в качестве примера, разработчик может использовать любые доступные ему комбинации.-
Установите СУБД Сервиса и подготовьте ее к работе.
-
Установите
gcc
(компилятор языка C, который потребуется для сборки компонентов среды разработки и для компиляции непосредственно программ на языке C). Для этого выполните следующую команду в терминале:sudo apt-get install gcc
-
Установите
libpq-dev
. Пакетlibpq-dev
содержит заголовочные файлы и статическую библиотеку для компиляции программ на C с использованием библиотекиlibpq
, которая отвечает за взаимодействие с серверной частью Сервиса транзакционной СУБД.sudo apt-get install libpq-dev
-
Загрузите и установите актуальную версию
libpqxx
. В этом руководстве для разработки первого приложения будет использоваться open-source библиотекаlibpqxx
- официальный C++ API для PostgreSQL, полностью совместимый с Сервисом транзакционной СУБД.
4.1 Загрузите и установите актуальную версиюlibpqxx
. Для этого выполните в терминале:Terminal_Console type=shwget 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
).-
Создайте тестовую базу данных
testdb
, с которой будет работать приложение. Для этого запустите интерфейс командной строки Сервиса транзакционной СУБД (psql
) и выполните команду:CREATE DATABASE testdb;
-
Убедитесь, что новая база данных создана. В интерфейсе командной строки Сервиса транзакционной СУБД выполните команду
\l
. Вы увидите примерно следующее:Console type=shpostgres-# \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-#
-
Выполните подключение к базе данных на локальной машине через порт 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; } }
-
Скомпилируйте программу и выполните ее.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 Операция выполнена успешно.