English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PostgreSQL C/C++ interface

Ce tutoriel utilisera la bibliothèque libpqxx, qui est une interface officielle C pour PostgreSQL ++API client. Le code source de libpqxx est disponible sous licence BSD, donc vous pouvez le télécharger gratuitement, le transmettre à autrui, le modifier, le vendre, le inclure dans votre propre code et partager vos modifications avec qui vous le souhaitez.

Installation

La dernière version de libpqxx peut être téléchargée via le lien de téléchargement de libpqxx (Téléchargement de libpqxx) Par conséquent, téléchargez la dernière version et suivez les étapes suivantes-

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

Avant de commencer à utiliser C / C ++ Avant d'utiliser l'interface PostgreSQL, trouvez le fichier pg_hba.conf dans le répertoire d'installation de PostgreSQL et ajoutez les lignes suivantes-

# IPv4 Connexions locales:
host    all         all         127.0.0.1/32          md5

Si le serveur postgres n'est pas en cours d'exécution, vous pouvez utiliser la commande suivante pour le démarrer/Redémarrage du serveur postgres-

[root@host]# service postgresql restart
Arrêt du service postgresql:                               [  OK  ]
Démarrage du service postgresql:                               [  OK  ]

C/C++ API d'interface

Voici des exemples d'interfaces importantes qui peuvent répondre à vos besoins pour accéder à partir de C/C++La demande d'utilisation de la base de données PostgreSQL dans le programme. Si vous cherchez une application plus complexe, vous pouvez consulter la documentation officielle de libpqxx ou utiliser des api disponibles commercialement.

API & Description
1

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

C'est un typedef, qui sera utilisé pour se connecter à la base de données. Ici, dbstring fournit les paramètres nécessaires pour se connecter à la base de données, par exemple :

dbname = testdb user = postgres password=pass123 hostaddr=127.0.0.1 port=5432.

Si la connexion est établie avec succès, elle crée une connexion entre C et l'objet de connexion, fournissant diverses fonctions utiles et des fonctions publiques.

2

C.is_open()

La méthode is_open() est une méthode publique de l'objet de connexion et retourne une valeur booléenne. Si la connexion est active, cette méthode retourne true, sinon false.

3

C.disconnect()

Cette méthode est utilisée pour couper la connexion à la base de données ouverte.

4

pqxx::work W( C )

C'est un typedef, utilisé pour créer des objets transactionnels en utilisant la connexion C, et qui finira par être utilisé pour exécuter des instructions SQL en mode transactionnel.

Si l'objet transactionnel est créé avec succès, il sera attribué à la variable W, qui sera utilisée pour accéder aux méthodes publiques liées à l'objet transactionnel.

5

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

Cette méthode publique de l'objet transactionnel sera utilisée pour exécuter des instructions SQL.

6

W.commit()

Cette méthode publique de l'objet transactionnel sera utilisée pour commit la transaction.

7

W.abort()

Cette méthode publique de l'objet transactionnel sera utilisée pour rollback la transaction.

8

pqxx::nontransaction N( C )

C'est un typedef, qui sera utilisé pour créer des objets non transactionnels en utilisant la connexion C, et qui finira par être utilisé pour exécuter des instructions SQL en mode non transactionnel.

Si l'objet transactionnel est créé avec succès, il sera attribué à la variable N, qui sera utilisée pour accéder aux méthodes publiques liées à l'objet non transactionnel.

9

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

Cette méthode publique provenant d'un objet non transactionnel sera utilisée pour exécuter des instructions SQL et renvoyer un objet result, qui est en réalité un iterateur contenant toutes les enregistrements retournés.

Connection à la base de données

Le segment de code C suivant montre comment se connecter à la base de données sur le port5432base de données existante qui s'exécute sur votre ordinateur local. Ici, j'utilise les barres obliques inversées '\' pour indiquer la continuité des lignes.

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

Maintenant, exécutons et compilons le programme ci-dessus pour nous connecter à notre base de données testdb, qui est déjà disponible dans votre schéma, et qui peut être accédée avec l'utilisateur postgres et le mot de passe pass123l'accès.}

Vous pouvez utiliser l'ID utilisateur et le mot de passe pour configurer la base de données. N'oubliez pas de garder-lpqxx et-lpq dans l'ordre donné! Sinon, le connecteur considérera que le nom manque et utilisera des fonctions commençant par "PQ".

$g++ test.cpp -lpqxx -lpq
$./a.out
Base de données ouverte avec succès : testdb

Créer une table

Le segment de code C suivant sera utilisé pour créer la table dans la base de données créée précédemment-

#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;
      }
      /* Créer une requête SQL */
      sql = "CREATE TABLE COMPANY(" \
      "ID INT PRIMARY KEY NOT NULL," \
      "NAME TEXT NOT NULL," \
      "AGE INT NOT NULL," \
      "ADDRESS CHAR(50)," \
      "SALARY REAL );";
      /* Créer un objet transaction. */
      work W(C);
      
      /* Exécuter une requête SQL */
      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;
}

Lorsque le programme donné ci-dessus est compilé et exécuté, il crée la table COMPANY dans la base de données testdb et affiche les instructions suivantes-

Base de données ouverte avec succès : testdb
Table créée avec succès

Opération INSERT

Le segment de code C suivant montre comment créer des enregistrements dans la table company créée dans l'exemple précédent-

#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;
      }
      /* Créer une instruction SQL */
      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 );";
      /* Créer un objet transaction. */
      work W(C);
      
      /* Exécuter une requête SQL */
      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;
}

Lorsque le programme donné ci-dessus est compilé et exécuté, il crée l'enregistrement donné dans la table COMPANY et affiche les deux lignes suivantes-

Base de données ouverte avec succès : testdb
Records created successfully

Opération SELECT

Le segment de code C suivant montre comment obtenir et afficher les enregistrements à partir du tableau COMPANY créé dans l'exemple précédent

#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;
      }
      /* Créer une instruction SQL */
      sql = "SELECT * from COMPANY";
      /* Créer un objet non transactionnel. */
      nontransaction N(C);
      
      /* Exécuter une requête SQL */
      result R(N.exec(sql));
      
      /* Lister tous les enregistrements */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Nom = " << c[1].as<string>() << endl;
         cout << "Âge = " << c[2].as<int>() << endl;
         cout << "Adresse = " << c[3].as<string>() << endl;
         cout << "Salaire = " << c[4].as<float>() << endl;
      }
      cout << "Opération effectuée avec succès" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Lorsque le programme donné ci-dessus est compilé et exécuté, il génère les résultats suivants-

Base de données ouverte avec succès : testdb
ID = 1
Nom = Paul
Âge = 32
Adresse = Californie
Salaire = 20000
ID = 2
Name = Allen
Âge = 25
Address = Texas
Salaire = 15000
ID = 3
Nom = Teddy
Âge = 23
Adresse = Norvège
Salaire = 20000
ID = 4
Nom = Mark
Âge = 25
Adresse = Rich-Mond
Salaire = 65000
Opération effectuée avec succès

Opération UPDATE

Le segment de code C suivant montre comment utiliser l'instruction UPDATE pour mettre à jour n'importe quel enregistrement, puis partir de la table COMPANY-Obtenir et afficher les enregistrements mis à jour

#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;
      }
      
      /* Créer un objet transaction. */
      work W(C);
      /* Créer une instruction SQL UPDATE */
      sql = "UPDATE COMPANY set SALARY =" 25000.00 where ID=1";
      /* Exécuter une requête SQL */
      W.exec(sql);
      W.commit();
      cout << "Records updated successfully" << endl;
      
      /* Créer une instruction SQL SELECT */
      sql = "SELECT * from COMPANY";
      /* Créer un objet non transactionnel. */
      nontransaction N(C);
      
      /* Exécuter une requête SQL */
      result R(N.exec(sql));
      
      /* Lister tous les enregistrements */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Nom = " << c[1].as<string>() << endl;
         cout << "Âge = " << c[2].as<int>() << endl;
         cout << "Adresse = " << c[3].as<string>() << endl;
         cout << "Salaire = " << c[4].as<float>() << endl;
      }
      cout << "Opération effectuée avec succès" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Lorsque le programme ci-dessus est compilé et exécuté, il produira les résultats suivants-

Base de données ouverte avec succès : testdb
Records updated successfully
ID = 2
Name = Allen
Âge = 25
Address = Texas
Salaire = 15000
ID = 3
Nom = Teddy
Âge = 23
Adresse = Norvège
Salaire = 20000
ID = 4
Nom = Mark
Âge = 25
Adresse = Rich-Mond
Salaire = 65000
ID = 1
Nom = Paul
Âge = 32
Adresse = Californie
Salaire = 25000
Opération effectuée avec succès

Opération DELETE

Le segment de code C suivant montre comment utiliser l'instruction DELETE pour supprimer n'importe quel enregistrement, puis partir de la table COMPANY-Obtenir et afficher les enregistrements restants

#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;
      }
      
      /* Créer un objet transaction. */
      work W(C);
      /* Créer une instruction SQL DELETE */
      sql = "DELETE from COMPANY where ID =" 2";
      /* Exécuter une requête SQL */
      W.exec(sql);
      W.commit();
      cout << "Enregistrements supprimés avec succès" << endl;
      
      /* Créer une déclaration SELECT SQL */
      sql = "SELECT * from COMPANY";
      /* Créer un objet non transactionnel. */
      nontransaction N(C);
      
      /* Exécuter une requête SQL */
      result R(N.exec(sql));
      
      /* Lister tous les enregistrements */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Nom = " << c[1].as<string>() << endl;
         cout << "Âge = " << c[2].as<int>() << endl;
         cout << "Adresse = " << c[3].as<string>() << endl;
         cout << "Salaire = " << c[4].as<float>() << endl;
      }
      cout << "Opération effectuée avec succès" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Lorsque le programme donné ci-dessus est compilé et exécuté, il génère les résultats suivants-

Base de données ouverte avec succès : testdb
Enregistrements supprimés avec succès
ID = 3
Nom = Teddy
Âge = 23
Adresse = Norvège
Salaire = 20000
ID = 4
Nom = Mark
Âge = 25
Adresse = Rich-Mond
Salaire = 65000
ID = 1
Nom = Paul
Âge = 32
Adresse = Californie
Salaire = 25000
Opération effectuée avec succès