PostgreSQL - C / C ++ - Schnittstelle

Dieses Tutorial wird verwendet libpqxxBibliothek, die offizielle C ++ - Client-API für PostgreSQL. Der Quellcode für libpqxx ist unter der BSD-Lizenz verfügbar. Sie können ihn also kostenlos herunterladen, an andere weitergeben, ändern, verkaufen, in Ihren eigenen Code aufnehmen und Ihre Änderungen an andere Personen weitergeben.

Installation

Die neueste Version von libpqxx kann über den Link Download Libpqxx heruntergeladen werden . Laden Sie also die neueste Version herunter und befolgen Sie die folgenden Schritte:

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

Bevor Sie mit der Verwendung der C / C ++ PostgreSQL-Schnittstelle beginnen, suchen Sie die pg_hba.conf Datei in Ihrem PostgreSQL-Installationsverzeichnis und fügen Sie die folgende Zeile hinzu:

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

Sie können den Postgres-Server starten / neu starten, falls er nicht mit dem folgenden Befehl ausgeführt wird:

[root@host]# service postgresql restart
Stopping postgresql service:                               [  OK  ]
Starting postgresql service:                               [  OK  ]

C / C ++ - Schnittstellen-APIs

Im Folgenden finden Sie wichtige Schnittstellenroutinen, die Ihre Anforderungen für die Arbeit mit der PostgreSQL-Datenbank in Ihrem C / C ++ - Programm erfüllen können. Wenn Sie nach einer komplexeren Anwendung suchen, können Sie in der offiziellen libpqxx-Dokumentation nachsehen oder handelsübliche APIs verwenden.

S. Nr. API & Beschreibung
1

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

Dies ist ein typedef, mit dem eine Verbindung zur Datenbank hergestellt wird. Hier bietet dbstring beispielsweise die erforderlichen Parameter, um eine Verbindung zur Datenbank herzustellendbname = testdb user = postgres password=pass123 hostaddr=127.0.0.1 port=5432.

Wenn die Verbindung erfolgreich hergestellt wurde, wird C mit dem Verbindungsobjekt erstellt, das verschiedene nützliche Funktionen für die öffentliche Funktion bereitstellt.

2

C.is_open()

Die Methode is_open () ist eine öffentliche Methode für ein Verbindungsobjekt und gibt einen booleschen Wert zurück. Wenn die Verbindung aktiv ist, gibt diese Methode true zurück, andernfalls false.

3

C.disconnect()

Diese Methode wird verwendet, um eine geöffnete Datenbankverbindung zu trennen.

4

pqxx::work W( C )

Dies ist ein typedef, mit dem ein Transaktionsobjekt über die Verbindung C erstellt wird, mit dem letztendlich SQL-Anweisungen im Transaktionsmodus ausgeführt werden.

Wenn das Transaktionsobjekt erfolgreich erstellt wurde, wird es der Variablen W zugewiesen, die für den Zugriff auf öffentliche Methoden für das Transaktionsobjekt verwendet wird.

5

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

Diese öffentliche Methode aus dem Transaktionsobjekt wird zum Ausführen der SQL-Anweisung verwendet.

6

W.commit()

Diese öffentliche Methode aus dem Transaktionsobjekt wird zum Festschreiben der Transaktion verwendet.

7

W.abort()

Diese öffentliche Methode aus dem Transaktionsobjekt wird verwendet, um die Transaktion zurückzusetzen.

8

pqxx::nontransaction N( C )

Dies ist ein typedef, der verwendet wird, um ein nicht transaktionales Objekt unter Verwendung von Verbindung C zu erstellen, das letztendlich verwendet wird, um SQL-Anweisungen im nicht transaktionalen Modus auszuführen.

Wenn das Transaktionsobjekt erfolgreich erstellt wurde, wird es der Variablen N zugewiesen, die für den Zugriff auf öffentliche Methoden für nicht-transaktionale Objekte verwendet wird.

9

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

Diese öffentliche Methode aus einem nicht transaktionalen Objekt wird zum Ausführen einer SQL-Anweisung verwendet und gibt ein Ergebnisobjekt zurück, das tatsächlich ein Interator ist, der alle zurückgegebenen Datensätze enthält.

Verbindung zur Datenbank herstellen

Das folgende C-Codesegment zeigt, wie eine Verbindung zu einer vorhandenen Datenbank hergestellt wird, die auf einem lokalen Computer an Port 5432 ausgeführt wird. Hier habe ich Backslash \ für die Zeilenfortsetzung verwendet.

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

Lassen Sie uns nun das obige Programm kompilieren und ausführen, um eine Verbindung zu unserer Datenbank herzustellen testdb, die bereits in Ihrem Schema verfügbar ist und mit dem Benutzer postgres und dem Kennwort pass123 aufgerufen werden kann .

Sie können die Benutzer-ID und das Kennwort basierend auf Ihrer Datenbankeinstellung verwenden. Denken Sie daran, die -lpqxx und -lpq in der angegebenen Reihenfolge zu halten! Andernfalls beschwert sich der Linker bitter über die fehlenden Funktionen mit Namen, die mit "PQ" beginnen.

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

Erstellen Sie eine Tabelle

Das folgende C-Codesegment wird verwendet, um eine Tabelle in einer zuvor erstellten Datenbank zu erstellen:

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

Wenn das oben angegebene Programm kompiliert und ausgeführt wird, erstellt es eine COMPANY-Tabelle in Ihrer testdb-Datenbank und zeigt die folgenden Anweisungen an:

Opened database successfully: testdb
Table created successfully

INSERT-Betrieb

Das folgende C-Codesegment zeigt, wie wir Datensätze in unserer im obigen Beispiel erstellten COMPANY-Tabelle erstellen können -

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

Wenn das oben angegebene Programm kompiliert und ausgeführt wird, werden die angegebenen Datensätze in der COMPANY-Tabelle erstellt und die folgenden zwei Zeilen angezeigt:

Opened database successfully: testdb
Records created successfully

SELECT-Betrieb

Das folgende C-Codesegment zeigt, wie wir Datensätze aus unserer im obigen Beispiel erstellten COMPANY-Tabelle abrufen und anzeigen können -

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

Wenn das oben angegebene Programm kompiliert und ausgeführt wird, wird das folgende Ergebnis erzeugt:

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

UPDATE-Betrieb

Das folgende C-Codesegment zeigt, wie wir mit der UPDATE-Anweisung jeden Datensatz aktualisieren und dann aktualisierte Datensätze aus unserer COMPANY-Tabelle abrufen und anzeigen können.

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

Wenn das oben angegebene Programm kompiliert und ausgeführt wird, wird das folgende Ergebnis erzeugt:

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

DELETE-Betrieb

Das folgende C-Codesegment zeigt, wie wir mit der DELETE-Anweisung jeden Datensatz löschen und dann die verbleibenden Datensätze aus unserer COMPANY-Tabelle abrufen und anzeigen können.

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

Wenn das oben angegebene Programm kompiliert und ausgeführt wird, wird das folgende Ergebnis erzeugt:

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