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