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

Interfaccia PostgreSQL C/C++

Questo tutorial utilizzerà la libreria libpqxx, che è l'API client ufficiale C++ di PostgreSQL. Il codice sorgente di libpqxx è disponibile sotto licenza BSD, quindi può essere scaricato gratuitamente, consegnato a terzi, modificato, venduto, incluso nel proprio codice e condiviso con chiunque lo scelga.

Installazione

La versione più recente di libpqxx può essere scaricata tramite il link di download libpqxx (Download libpqxx). Pertanto, scarica l'ultima versione e segui i seguenti passaggi:

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

Prima di iniziare a utilizzare l'interfaccia C / C ++ PostgreSQL, trova il file pg_hba.conf nella directory di installazione di PostgreSQL e aggiungi le seguenti righe:

# Connessioni locali IPv4:
host all all all 127.0.0.1/32 md5

Se il server postgres non è in esecuzione, puoi utilizzare i seguenti comandi per avviare/riavviare il server postgres:

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

Interfaccia API C/C++

Di seguito sono riportati gli importanti esempi di routine di interfaccia, che possono soddisfare le tue esigenze di utilizzo del database PostgreSQL nei programmi C/C++. Se stai cercando un'applicazione più complessa, puoi consultare la documentazione ufficiale di libpqxx o utilizzare api disponibili commercialmente.

Num. S.API & Descrizione
1

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

Questo è un typedef utilizzato per connettersi al database. In questo caso, dbstring fornisce i parametri necessari per connettersi al database, ad esempio:

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

Se la connessione viene stabilita con successo, allora crea C con l'oggetto di connessione, fornendo vari funzioni pubbliche utili.

2

C.is_open()

Il metodo pubblico is_open() dell'oggetto di connessione restituisce un valore booleano. Se la connessione è attiva, questo metodo restituisce true, altrimenti restituisce false.

3

C.disconnect()

Questo metodo viene utilizzato per disconnettere la connessione di database aperta.

4

pqxx::work W( C )

Questo typedef viene utilizzato per creare oggetti transazionali utilizzando la connessione C, che verranno utilizzati per eseguire query SQL in modalità transazionale.

Se l'oggetto transazionale viene creato con successo, allora sarà assegnato alla variabile W, che verrà utilizzata per accedere ai metodi pubblici dell'oggetto transazionale.

5

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

Questo metodo pubblico dell'oggetto transazionale verrà utilizzato per eseguire query SQL.

6

W.commit()

Questo metodo pubblico dell'oggetto transazionale verrà utilizzato per confermare la transazione.

7

W.abort()

Questo metodo pubblico dell'oggetto transazionale verrà utilizzato per annullare la transazione.

8

pqxx::nontransaction N( C )

Questo typedef verrà utilizzato per creare oggetti non transazionali utilizzando la connessione C, che verranno utilizzati per eseguire query SQL in modalità non transazionale.

Se l'oggetto transazionale viene creato con successo, allora sarà assegnato alla variabile N, che verrà utilizzata per accedere ai metodi pubblici dell'oggetto non transazionale.

9

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

Questo metodo pubblico proveniente da un oggetto non transazionale verrà utilizzato per eseguire query SQL e restituire un oggetto result, che è in realtà un iterator che contiene tutte le record restituite.

Connessione al database

Il seguente segmento di codice C mostra come connettersi a un database esistente che gira sul computer locale sulla porta 5432. Qui, utilizzo la barra inversa \ per indicare la prosecuzione della riga.

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

Ora, compiliamo ed eseguiamo il programma sopra per connetterci al nostro database testdb, che è disponibile nel tuo schema, e che può essere acceduto con l'utente postgres e la password pass123.

Puoi utilizzare l'ID utente e la password del database secondo la configurazione del database. Ricorda di mantenere l'ordine dato di -lpqxx e -lpq! Altrimenti, il connettore considererà mancante il nome e utilizzerà le funzioni che iniziano con "PQ".

$g++ test.cpp -lpqxx -lpq
$./a.out
Database aperto con successo: testdb

Creazione della tabella

Il seguente segmento di codice C verrà utilizzato per creare una tabella nel database precedentemente creato-

#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;
      }
      /* Creazione della query SQL */
      sql = "CREATE TABLE COMPANY(\"
      "ID INT PRIMARIA CHIAVE, NON NULL,\"
      "NAME TEXT NOT NULL," \
      "AGE INT NOT NULL," \
      "ADDRESS CHAR(50)," \
      "SALARY REAL);"
      /* Creare un oggetto transazione. */
      work W(C);
      
      /* Eseguire query SQL */
      W.exec( sql );
      W.commit();
      cout << "Tabella creata con successo" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Quando si compila ed esegue il programma fornito di seguito, creerà la tabella COMPANY nel database testdb e visualizzerà le seguenti istruzioni:

Database aperto con successo: testdb
Tabella creata con successo

Operazione INSERT

Il seguente segmento di codice C mostra come creare record nella tabella company creata nell'esempio precedente

#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;
      }
      /* Creare 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);"
      /* Creare un oggetto transazione. */
      work W(C);
      
      /* Eseguire query SQL */
      W.exec( sql );
      W.commit();
      cout << "Records creati con successo" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Quando si compila ed esegue il programma fornito di seguito, creerà i record specificati nella tabella COMPANY e visualizzerà le seguenti due righe:

Database aperto con successo: testdb
Records creati con successo

Operazione SELECT

Il seguente segmento di codice C dimostra come ottenere e visualizzare i record dalla tabella COMPANY creata nell'esempio precedente

#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;
      }
      /* Creare SQL Statement */
      sql = "SELECT * from COMPANY";
      /* Crea oggetto non transazionale */
      nontransaction N(C);
      
      /* Esegui query SQL */
      result R(N.exec(sql));
      
      /* Elenca tutti i record */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Nome = " << c[1].as<string>() << endl;
         cout << "Età = " << c[2].as<int>() << endl;
         cout << "Indirizzo = " << c[3].as<string>() << endl;
         cout << "Stipendio = " << c[4].as<float>() << endl;
      }
      cout << "Operazione eseguita con successo" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Quando si compila ed esegue il programma sopra riportato, viene generato il seguente risultato-

Database aperto con successo: testdb
ID = 1
Nome = Paul
Età = 32
Indirizzo = California
Stipendio = 20000
ID = 2
Name = Allen
Età = 25
Address = Texas
Salary = 15000
ID = 3
Nome = Teddy
Età = 23
Indirizzo = Norway
Stipendio = 20000
ID = 4
Nome = Mark
Età = 25
Indirizzo = Rich-Mond
Stipendio = 65000
Operazione eseguita con successo

Operazione UPDATE

Il seguente segmento di codice C mostra come utilizzare l'istruzione UPDATE per aggiornare qualsiasi record e quindi ottenere e visualizzare i record aggiornati dalla tabella COMPANY

#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;
      }
      
      /* Creare un oggetto transazione. */
      work W(C);
      /* Creare una statement SQL UPDATE */
      sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1";
      /* Eseguire query SQL */
      W.exec( sql );
      W.commit();
      cout << "Records updated successfully" << endl;
      
      /* Creare una statement SQL SELECT */
      sql = "SELECT * from COMPANY";
      /* Creare un oggetto non transazionale. */
      nontransaction N(C);
      
      /* Esegui query SQL */
      result R(N.exec(sql));
      
      /* Elenca tutti i record */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Nome = " << c[1].as<string>() << endl;
         cout << "Età = " << c[2].as<int>() << endl;
         cout << "Indirizzo = " << c[3].as<string>() << endl;
         cout << "Stipendio = " << c[4].as<float>() << endl;
      }
      cout << "Operazione eseguita con successo" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Quando il programma sopra menzionato viene compilato ed eseguito, produrrà i seguenti risultati-

Database aperto con successo: testdb
Records updated successfully
ID = 2
Name = Allen
Età = 25
Address = Texas
Salary = 15000
ID = 3
Nome = Teddy
Età = 23
Indirizzo = Norway
Stipendio = 20000
ID = 4
Nome = Mark
Età = 25
Indirizzo = Rich-Mond
Stipendio = 65000
ID = 1
Nome = Paul
Età = 32
Indirizzo = California
Stipendio = 25000
Operazione eseguita con successo

Operazione DELETE

Il seguente segmento di codice C mostra come utilizzare una statement DELETE per eliminare qualsiasi record e quindi ottenere e visualizzare i record rimanenti dalla tabella COMPANY

#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;
      }
      
      /* Creare un oggetto transazione. */
      work W(C);
      /* Creare una statement SQL DELETE */
      sql = "DELETE from COMPANY where ID = 2";
      /* Esegui query SQL */
      W.exec( sql );
      W.commit();
      cout << "Records deleted successfully" << endl;
      
      /* Creare una statement SQL SELECT */
      sql = "SELECT * from COMPANY";
      /* Crea oggetto non transazionale */
      nontransaction N(C);
      
      /* Esegui query SQL */
      result R(N.exec(sql));
      
      /* Elenca tutti i record */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Nome = " << c[1].as<string>() << endl;
         cout << "Età = " << c[2].as<int>() << endl;
         cout << "Indirizzo = " << c[3].as<string>() << endl;
         cout << "Stipendio = " << c[4].as<float>() << endl;
      }
      cout << "Operazione eseguita con successo" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Quando si compila ed esegue il programma sopra riportato, viene generato il seguente risultato-

Database aperto con successo: testdb
Record cancellati con successo
ID = 3
Nome = Teddy
Età = 23
Indirizzo = Norway
Stipendio = 20000
ID = 4
Nome = Mark
Età = 25
Indirizzo = Rich-Mond
Stipendio = 65000
ID = 1
Nome = Paul
Età = 32
Indirizzo = California
Stipendio = 25000
Operazione eseguita con successo