In this tutorial, i’ll demonstrate an example on how to connect to PostgreSQL database using gcc in linux. Also, i’ll demonstrate some basic SQL execution in the C++ example so that it give better understading to you how all of these are working.
If you are looking a tutorial for windows platform, you could visit the following link which demonstrate the tutorial for windows platform. C++ PostgreSQL Example in Windows
To begin this tutorial, let’s make sure that you have the PostgreSQL install into your linux box. I’m using Ubuntu linux in this demo. Use the following command to download & intstall PostgreSQL if it’s not exists in your linux box.
Let’s turn on the psql command console with the following command:
Let’s create a password for this by using the following command in psql console:
You will need to key in you password now. I use password “test123″ in this demo.
Let’s create the database now by using the following command in psql console. Our database name in this demo called “testdb”.
At this point, we’ve the PostgreSQL database created and we can now writing some C++ code to establish connection to this database. We will start the coding part in our cpp file now. I called the cpp file – “PSQLTest.cpp”. Make sure that you include the following header accordingly. libpq-fe.h must be included.
Now we start our very first functon named CloseConn(). This function will make sure that we close the database connection accordingly.
Next, we create a function named ConnectDB(). This function will establish a connection to PostgreSQL server. Please be sure that you provide the correct parameters in PostgreSQL(). Prior to this example, i have setup a database called testdb with user password of test123 during the installation. You might need to modify it accordingly in order to make sure the compilation success.
Next, we create a function named CreateEmployeeTable(). This function will create an employee table in our testdb database.
Next, we create a function named InsertEmployeeRec(). This function will take 2 parameters, fname and lname in char pointer type, to form a SQL statement. It then will be executed in order to store the record into the employee table.
Next, we create a function named FetchEmployeeRec(). This function will fetch all the record in employee table and display it on the console windows.
Next, we create a function named RemoveAllEmployeeRec(). This function will remove all record in employee table.
Next, we create a function named DropEmployeeTable(). This function will drop or remove the employee from the testdb database.
Finally, we update the main entry point function so that it call all the functions that we have created to demonstrate what we intend to show in this example.
Try to compile and run the application now. You should see the following screenshot. REMEMBER, in order to make sure that the compilation can be done successfully, you must tell the gcc compiler where to find postgres include file. Also, you must include postgres library into your c++ project as well. All this can be done by supplying the following argument in the gcc command.
If you are new to C++ compilation in Linux, please visit to my previous post which should guide you on how to compile C++ in Linux. Compiling C++ code by using g++ in Ubuntu
If you try to break the C++ program before it remove and drop the employee table. Enter to psql command console and you should be able to read you table data as the following screenshot.
Download sample source code: PSQLTest.zip
$ sudo apt-get install postgresql
$ sudo -u postgres psql template1
# \password postgres
# create database testdb;

1 2 3 4 | #include <iostream> #include "libpq-fe.h" using namespace std; |
1 2 3 4 5 6 | /* Close connection to database */ void CloseConn(PGconn *conn) { PQfinish(conn); getchar(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* Establish connection to database */ PGconn *ConnectDB() { PGconn *conn = NULL; // Make a connection to the database conn = PQconnectdb("user=postgres password=test123 dbname=testdb hostaddr=127.0.0.1 port=5432"); // Check to see that the backend connection was successfully made if (PQstatus(conn) != CONNECTION_OK) { cout << "Connection to database failed.\n"; CloseConn(conn); } cout << "Connection to database - OK\n"; return conn; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* Create employee table */ void CreateEmployeeTable(PGconn *conn) { // Execute with sql statement PGresult *res = PQexec(conn, "CREATE TABLE employee (Fname char(30), Lname char(30))"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { cout << "Create employee table failed\n"; PQclear(res); CloseConn(conn); } cout << "Create employee table - OK\n"; // Clear result PQclear(res); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | /* Append SQL statement and insert record into employee table */ void InsertEmployeeRec(PGconn *conn, const char * fname, const char * lname) { // Append the SQL statment std::string sSQL; sSQL.append("INSERT INTO employee VALUES ('"); sSQL.append(fname); sSQL.append("', '"); sSQL.append(lname); sSQL.append("')"); // Execute with sql statement PGresult *res = PQexec(conn, sSQL.c_str()); if (PQresultStatus(res) != PGRES_COMMAND_OK) { cout << "Insert employee record failed\n"; PQclear(res); CloseConn(conn); } cout << "Insert employee record - OK\n"; // Clear result PQclear(res); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | /* Fetch employee record and display it on screen */ void FetchEmployeeRec(PGconn *conn) { // Will hold the number of field in employee table int nFields; // Start a transaction block PGresult *res = PQexec(conn, "BEGIN"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { cout << "BEGIN command failed\n"; PQclear(res); CloseConn(conn); } // Clear result PQclear(res); // Fetch rows from employee table res = PQexec(conn, "DECLARE emprec CURSOR FOR select * from employee"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { cout << "DECLARE CURSOR failed\n"; PQclear(res); CloseConn(conn); } // Clear result PQclear(res); res = PQexec(conn, "FETCH ALL in emprec"); if (PQresultStatus(res) != PGRES_TUPLES_OK) { cout << "FETCH ALL failed\n"; PQclear(res); CloseConn(conn); } // Get the field name nFields = PQnfields(res); // Prepare the header with employee table field name cout << "\nFetch employee record:"; cout << "\n********************************************************************\n"; for (int i = 0; i < nFields; i++) printf("%-30s", PQfname(res, i)); cout << "\n********************************************************************\n"; // Next, print out the employee record for each row for (int i = 0; i < PQntuples(res); i++) { for (int j = 0; j < nFields; j++) printf("%-30s", PQgetvalue(res, i, j)); printf("\n"); } PQclear(res); // Close the emprec res = PQexec(conn, "CLOSE emprec"); PQclear(res); // End the transaction res = PQexec(conn, "END"); // Clear result PQclear(res); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* Erase all record in employee table */ void RemoveAllEmployeeRec(PGconn *conn) { // Execute with sql statement PGresult *res = PQexec(conn, "DELETE FROM employee"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { cout << "Delete employees record failed.\n"; PQclear(res); CloseConn(conn); } cout << "\nDelete employees record - OK\n"; // Clear result PQclear(res); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* Drop employee table from the database*/ void DropEmployeeTable(PGconn *conn) { // Execute with sql statement PGresult *res = PQexec(conn, "DROP TABLE employee"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { cout << "Drop employee table failed.\n"; PQclear(res); CloseConn(conn); } cout << "Drop employee table - OK\n"; // Clear result PQclear(res); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | int main() { PGconn *conn = NULL; conn = ConnectDB(); if (conn != NULL) { CreateEmployeeTable(conn); InsertEmployeeRec(conn, "Mario", "Hewardt"); InsertEmployeeRec(conn, "Daniel", "Pravat"); FetchEmployeeRec(conn); cout << "\nPress ENTER to remove all records & table.....\n"; getchar(); RemoveAllEmployeeRec(conn); DropEmployeeTable(conn); CloseConn(conn); } return 0; } |
$ g++ PSQLTest.cpp -I /usr/include/postgresql/include -l pq -o PSQLTest
$ ./PSQLTest
$ ./PSQLTest

