PostgreSQL - Interfaz C / C ++

Este tutorial va a utilizar libpqxxbiblioteca, que es la API de cliente oficial de C ++ para PostgreSQL. El código fuente de libpqxx está disponible bajo la licencia BSD, por lo que puede descargarlo, pasarlo a otros, cambiarlo, venderlo, incluirlo en su propio código y compartir sus cambios con quien desee.

Instalación

La última versión de libpqxx está disponible para descargar desde el enlace Descargar Libpqxx . Así que descargue la última versión y siga los siguientes pasos:

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

Antes de comenzar a utilizar la interfaz C / C ++ PostgreSQL, busque el pg_hba.conf en su directorio de instalación de PostgreSQL y agregue la siguiente línea -

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

Puede iniciar / reiniciar el servidor de Postgres en caso de que no se esté ejecutando usando el siguiente comando:

[[email protected]]# service postgresql restart
Stopping postgresql service:                               [  OK  ]
Starting postgresql service:                               [  OK  ]

API de interfaz C / C ++

Las siguientes son rutinas de interfaz importantes que pueden ser suficientes para trabajar con la base de datos PostgreSQL desde su programa C / C ++. Si está buscando una aplicación más sofisticada, puede consultar la documentación oficial de libpqxx o puede utilizar las API disponibles comercialmente.

S. No. API y descripción
1

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

Este es un typedef que se utilizará para conectarse a la base de datos. Aquí, dbstring proporciona los parámetros necesarios para conectarse a la base de datos, por ejemplodbname = testdb user = postgres password=pass123 hostaddr=127.0.0.1 port=5432.

Si la conexión se configura correctamente, crea C con un objeto de conexión que proporciona varias funciones públicas útiles.

2

C.is_open()

El método is_open () es un método público de objeto de conexión y devuelve un valor booleano. Si la conexión está activa, este método devuelve verdadero; de lo contrario, devuelve falso.

3

C.disconnect()

Este método se utiliza para desconectar una conexión de base de datos abierta.

4

pqxx::work W( C )

Este es un typedef que se usará para crear un objeto transaccional usando la conexión C, que finalmente se usará para ejecutar sentencias SQL en modo transaccional.

Si el objeto de transacción se crea con éxito, entonces se asigna a la variable W que se utilizará para acceder a los métodos públicos relacionados con el objeto de transacción.

5

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

Este método público del objeto transaccional se utilizará para ejecutar la instrucción SQL.

6

W.commit()

Este método público del objeto transaccional se utilizará para confirmar la transacción.

7

W.abort()

Este método público del objeto transaccional se utilizará para revertir la transacción.

8

pqxx::nontransaction N( C )

Este es un typedef que se usará para crear un objeto no transaccional usando la conexión C, que finalmente se usará para ejecutar sentencias SQL en modo no transaccional.

Si el objeto de transacción se crea correctamente, se asigna a la variable N, que se utilizará para acceder a los métodos públicos relacionados con el objeto no transaccional.

9

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

Este método público del objeto no transaccional se utilizará para ejecutar la instrucción SQL y devuelve un objeto de resultado que en realidad es un interador que contiene todos los registros devueltos.

Conectando a la base de datos

El siguiente segmento de código C muestra cómo conectarse a una base de datos existente que se ejecuta en una máquina local en el puerto 5432. Aquí, utilicé barra invertida \ para la continuación de la línea.

#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;
   }
}

Ahora, compilemos y ejecutemos el programa anterior para conectarnos a nuestra base de datos testdb, que ya está disponible en su esquema y se puede acceder usando postgres de usuario y contraseña pass123 .

Puede utilizar el ID de usuario y la contraseña según la configuración de su base de datos. ¡Recuerde mantener -lpqxx y -lpq en el orden indicado! De lo contrario, el enlazador se quejará amargamente de las funciones que faltan con nombres que comienzan con "PQ".

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

Crear una tabla

El siguiente segmento de código C se utilizará para crear una tabla en la base de datos creada anteriormente:

#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;
}

Cuando el programa anterior se compila y ejecuta, creará la tabla EMPRESA en su base de datos testdb y mostrará las siguientes declaraciones:

Opened database successfully: testdb
Table created successfully

INSERTAR Operación

El siguiente segmento de código C muestra cómo podemos crear registros en nuestra tabla EMPRESA creada en el ejemplo anterior:

#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;
}

Cuando se compile y ejecute el programa dado anteriormente, creará registros dados en la tabla EMPRESA y mostrará las siguientes dos líneas:

Opened database successfully: testdb
Records created successfully

SELECCIONAR Operación

El siguiente segmento de código C muestra cómo podemos buscar y mostrar registros de nuestra tabla EMPRESA creada en el ejemplo anterior:

#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;
}

Cuando el programa anterior se compila y ejecuta, producirá el siguiente resultado:

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

Operación ACTUALIZAR

El siguiente segmento de código C muestra cómo podemos usar la instrucción UPDATE para actualizar cualquier registro y luego buscar y mostrar registros actualizados de nuestra tabla EMPRESA:

#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;
}

Cuando el programa anterior se compila y ejecuta, producirá el siguiente resultado:

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

Operación DELETE

El siguiente segmento de código C muestra cómo podemos usar la instrucción DELETE para eliminar cualquier registro y luego buscar y mostrar los registros restantes de nuestra tabla EMPRESA:

#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;
}

Cuando el programa anterior se compila y ejecuta, producirá el siguiente resultado:

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