PostgreSQL - C / C ++ Arayüzü

Bu öğretici kullanacak libpqxxPostgreSQL için resmi C ++ istemci API'si olan kitaplık. Libpqxx için kaynak kodu BSD lisansı altında mevcuttur, bu yüzden onu indirmekte, başkalarına devretmekte, değiştirmekte, satmakta, kendi kodunuza dahil etmekte ve değişikliklerinizi seçtiğiniz herhangi bir kişiyle paylaşmakta özgürsünüz.

Kurulum

Libpqxx'in en son sürümü, Libpqxx İndir bağlantısından indirilebilir . Bu yüzden en son sürümü indirin ve aşağıdaki adımları izleyin -

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

C / C ++ PostgreSQL arayüzünü kullanmaya başlamadan önce, pg_hba.conf PostgreSQL kurulum dizininizdeki dosya ve aşağıdaki satırı ekleyin -

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

Aşağıdaki komutu kullanarak çalışmaması durumunda postgres sunucusunu başlatabilir / yeniden başlatabilirsiniz -

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

C / C ++ Arayüz API'leri

Aşağıdakiler, C / C ++ programınızdan PostgreSQL veritabanı ile çalışma gereksinimlerinizi karşılayabilecek önemli arayüz yordamlarıdır. Daha karmaşık bir uygulama arıyorsanız, libpqxx resmi belgelerine bakabilir veya piyasada satılan API'leri kullanabilirsiniz.

S. No. API ve Açıklama
1

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

Bu, veritabanına bağlanmak için kullanılacak bir typedef. Burada dbstring, örneğin veri tabanına bağlanmak için gerekli parametreleri sağlar.dbname = testdb user = postgres password=pass123 hostaddr=127.0.0.1 port=5432.

Bağlantı başarılı bir şekilde kurulursa, çeşitli faydalı genel işlev işlevi sağlayan bağlantı nesnesiyle C oluşturur.

2

C.is_open()

İs_open () yöntemi, bağlantı nesnesinin genel bir yöntemidir ve boole değerini döndürür. Bağlantı etkinse, bu yöntem true, aksi takdirde false döndürür.

3

C.disconnect()

Bu yöntem, açık bir veritabanı bağlantısını kesmek için kullanılır.

4

pqxx::work W( C )

Bu, C bağlantısını kullanarak bir işlem nesnesi oluşturmak için kullanılacak ve sonuçta işlem modunda SQL ifadelerini yürütmek için kullanılacak bir typedef.

İşlem nesnesi başarıyla oluşturulursa, işlem nesnesi ile ilgili genel yöntemlere erişmek için kullanılacak olan W değişkenine atanır.

5

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

İşlem nesnesindeki bu genel yöntem, SQL deyimini yürütmek için kullanılacaktır.

6

W.commit()

İşlem nesnesindeki bu genel yöntem, işlemi gerçekleştirmek için kullanılacaktır.

7

W.abort()

İşlem nesnesindeki bu genel yöntem, işlemi geri almak için kullanılacaktır.

8

pqxx::nontransaction N( C )

Bu, C bağlantısını kullanarak işlemsel olmayan bir nesne oluşturmak için kullanılacak bir typedef'tir ve sonuçta işlem dışı modda SQL deyimlerini yürütmek için kullanılacaktır.

İşlem nesnesi başarıyla oluşturulursa, işlem olmayan nesneyle ilgili genel yöntemlere erişmek için kullanılacak olan N değişkenine atanır.

9

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

İşlemsel olmayan nesneden gelen bu genel yöntem, SQL ifadesini yürütmek için kullanılacak ve aslında döndürülen tüm kayıtları tutan bir uygulayıcı olan bir sonuç nesnesi döndürür.

Veritabanına Bağlanma

Aşağıdaki C kodu segmenti, 5432 numaralı bağlantı noktasında yerel makinede çalışan mevcut bir veritabanına nasıl bağlanılacağını gösterir. Burada satır devamı için ters eğik çizgi \ kullandım.

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

Şimdi, veritabanımıza bağlanmak için yukarıdaki programı derleyip çalıştıralım. testdbSenin şemada zaten mevcuttur ve kullanıcı kullanarak erişilebilir hangi postgres ve şifre pass123 .

Veritabanı ayarlarınıza bağlı olarak kullanıcı kimliğini ve parolayı kullanabilirsiniz. -Lpqxx ve -lpq'yi verilen sırada tutmayı unutmayın! Aksi takdirde, bağlayıcı "PQ" ile başlayan adlarla eksik işlevlerden acı bir şekilde şikayet eder.

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

Tablo Oluşturun

Aşağıdaki C kodu segmenti, önceden oluşturulmuş veritabanında bir tablo oluşturmak için kullanılacaktır -

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

Yukarıda verilen program derlendiğinde ve çalıştırıldığında, testdb veritabanınızda COMPANY tablosu oluşturacak ve aşağıdaki ifadeleri gösterecektir -

Opened database successfully: testdb
Table created successfully

INSERT İşlemi

Aşağıdaki C kodu segmenti, yukarıdaki örnekte oluşturulan COMPANY tablomuzda nasıl kayıt oluşturabileceğimizi gösterir -

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

Yukarıda verilen program derlendiğinde ve yürütüldüğünde, ŞİRKET tablosunda verilen kayıtları oluşturacak ve aşağıdaki iki satırı görüntüleyecektir -

Opened database successfully: testdb
Records created successfully

SELECT İşlemi

Aşağıdaki C kodu segmenti, yukarıdaki örnekte oluşturulan COMPANY tablomuzdan kayıtları nasıl getirip görüntüleyebileceğimizi gösterir -

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

Yukarıda verilen program derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verecektir -

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

GÜNCELLEME İşlemi

Aşağıdaki C kodu segmenti, herhangi bir kaydı güncellemek ve ardından güncellenmiş kayıtları COMPANY tablomuzdan almak ve görüntülemek için UPDATE ifadesini nasıl kullanabileceğimizi gösterir -

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

Yukarıda verilen program derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verecektir -

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 İşlemi

Aşağıdaki C kodu segmenti, herhangi bir kaydı silmek için DELETE ifadesini nasıl kullanabileceğimizi ve ardından kalan kayıtları COMPANY tablomuzdan alıp görüntüleyebileceğimizi gösterir -

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

Yukarıda verilen program derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verecektir -

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