PostgreSQL - อินเตอร์เฟส C / C ++

บทช่วยสอนนี้จะใช้ libpqxxไลบรารีซึ่งเป็น API ไคลเอนต์ C ++ อย่างเป็นทางการสำหรับ PostgreSQL ซอร์สโค้ดสำหรับ libpqxx มีอยู่ภายใต้ใบอนุญาต BSD ดังนั้นคุณจึงมีอิสระในการดาวน์โหลดส่งต่อให้ผู้อื่นเปลี่ยนแปลงขายรวมไว้ในรหัสของคุณเองและแบ่งปันการเปลี่ยนแปลงของคุณกับใครก็ได้

การติดตั้ง

รุ่นล่าสุดของ libpqxx สามารถใช้ได้เพื่อดาวน์โหลดได้จากลิงค์ดาวน์โหลด Libpqxx ดังนั้นดาวน์โหลดเวอร์ชันล่าสุดและทำตามขั้นตอนต่อไปนี้ -

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 ให้ค้นหาไฟล์ pg_hba.conf ไฟล์ในไดเร็กทอรีการติดตั้ง PostgreSQL ของคุณและเพิ่มบรรทัดต่อไปนี้ -

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

คุณสามารถเริ่ม / รีสตาร์ทเซิร์ฟเวอร์ postgres ในกรณีที่ไม่ได้ทำงานโดยใช้คำสั่งต่อไปนี้ -

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

API ของอินเตอร์เฟส C / C ++

ต่อไปนี้เป็นรูทีนอินเทอร์เฟซที่สำคัญซึ่งสามารถตอบสนองความต้องการของคุณในการทำงานกับฐานข้อมูล PostgreSQL จากโปรแกรม C / C ++ ของคุณ หากคุณกำลังมองหาแอปพลิเคชันที่ซับซ้อนมากขึ้นคุณสามารถดูเอกสารอย่างเป็นทางการของ libpqxx หรือคุณสามารถใช้ API ที่มีจำหน่ายทั่วไป

ส. เลขที่ API และคำอธิบาย
1

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

นี่คือ typedef ซึ่งจะใช้เพื่อเชื่อมต่อกับฐานข้อมูล ที่นี่ dbstring จัดเตรียมพารามิเตอร์ที่จำเป็นเพื่อเชื่อมต่อกับฐานข้อมูลตัวอย่างเช่นdbname = testdb user = postgres password=pass123 hostaddr=127.0.0.1 port=5432.

หากตั้งค่าการเชื่อมต่อสำเร็จแล้วจะสร้าง C พร้อมวัตถุการเชื่อมต่อซึ่งมีฟังก์ชันสาธารณะที่มีประโยชน์มากมาย

2

C.is_open()

เมธอด is_open () เป็นเมธอดสาธารณะของอ็อบเจ็กต์การเชื่อมต่อและส่งคืนค่าบูลีน หากการเชื่อมต่อทำงานอยู่วิธีนี้จะคืนค่าจริงมิฉะนั้นจะส่งกลับเท็จ

3

C.disconnect()

วิธีนี้ใช้เพื่อยกเลิกการเชื่อมต่อฐานข้อมูลที่เปิดอยู่

4

pqxx::work W( C )

นี่คือ typedef ซึ่งจะใช้ในการสร้างวัตถุทรานแซคชันโดยใช้การเชื่อมต่อ C ซึ่งท้ายที่สุดจะใช้เพื่อดำเนินการคำสั่ง SQL ในโหมดธุรกรรม

หากสร้างวัตถุธุรกรรมสำเร็จแล้วจะถูกกำหนดให้กับตัวแปร W ซึ่งจะใช้ในการเข้าถึงวิธีการสาธารณะที่เกี่ยวข้องกับวัตถุธุรกรรม

5

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

วิธีการสาธารณะจากวัตถุการทำธุรกรรมนี้จะถูกใช้เพื่อดำเนินการคำสั่ง SQL

6

W.commit()

วิธีการสาธารณะจากวัตถุการทำธุรกรรมนี้จะถูกใช้เพื่อกระทำธุรกรรม

7

W.abort()

วิธีการสาธารณะจากวัตถุธุรกรรมนี้จะถูกใช้เพื่อย้อนกลับธุรกรรม

8

pqxx::nontransaction N( C )

นี่คือ typedef ซึ่งจะใช้ในการสร้างออบเจ็กต์ที่ไม่ใช่ธุรกรรมโดยใช้การเชื่อมต่อ C ซึ่งในที่สุดจะใช้เพื่อดำเนินการคำสั่ง SQL ในโหมดที่ไม่ใช่ธุรกรรม

หากสร้างวัตถุธุรกรรมสำเร็จแล้วจะถูกกำหนดให้กับตัวแปร N ซึ่งจะใช้เพื่อเข้าถึงวิธีการสาธารณะที่เกี่ยวข้องกับออบเจ็กต์ที่ไม่ใช่ธุรกรรม

9

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

วิธีการสาธารณะจากอ็อบเจ็กต์ที่ไม่ใช่ธุรกรรมนี้จะถูกใช้เพื่อดำเนินการคำสั่ง SQL และส่งคืนอ็อบเจ็กต์ผลลัพธ์ซึ่งเป็นจำนวนเต็มที่เก็บเร็กคอร์ดทั้งหมด

การเชื่อมต่อกับฐานข้อมูล

ส่วนรหัส C ต่อไปนี้แสดงวิธีการเชื่อมต่อกับฐานข้อมูลที่มีอยู่ซึ่งทำงานบนเครื่องโลคัลที่พอร์ต 5432 ที่นี่ฉันใช้แบ็กสแลช \ สำหรับการต่อเนื่องของบรรทัด

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

ตอนนี้ให้เรารวบรวมและเรียกใช้โปรแกรมด้านบนเพื่อเชื่อมต่อกับฐานข้อมูลของเรา testdbซึ่งมีอยู่แล้วในคีมาของคุณและสามารถเข้าถึงได้โดยผู้ใช้Postgresและรหัสผ่านpass123

คุณสามารถใช้ ID ผู้ใช้และรหัสผ่านตามการตั้งค่าฐานข้อมูลของคุณ อย่าลืมเก็บ -lpqxx และ -lpq ตามลำดับที่กำหนด! มิฉะนั้นผู้เชื่อมโยงจะบ่นอย่างขมขื่นเกี่ยวกับฟังก์ชันที่ขาดหายไปโดยมีชื่อขึ้นต้นด้วย "PQ"

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

สร้างตาราง

ส่วนรหัส C ต่อไปนี้จะถูกใช้เพื่อสร้างตารางในฐานข้อมูลที่สร้างไว้ก่อนหน้านี้ -

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

เมื่อโปรแกรมที่ระบุข้างต้นถูกคอมไพล์และดำเนินการโปรแกรมจะสร้างตาราง COMPANY ในฐานข้อมูล testdb ของคุณและจะแสดงข้อความต่อไปนี้ -

Opened database successfully: testdb
Table created successfully

การทำงานของ INSERT

ส่วนรหัส C ต่อไปนี้แสดงให้เห็นว่าเราสามารถสร้างเรกคอร์ดในตาราง 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;
      }

      /* 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;
}

เมื่อโปรแกรมที่กำหนดข้างต้นถูกคอมไพล์และดำเนินการโปรแกรมจะสร้างระเบียนที่กำหนดในตาราง COMPANY และจะแสดงสองบรรทัดต่อไปนี้ -

Opened database successfully: testdb
Records created successfully

เลือกการทำงาน

ส่วนรหัส C ต่อไปนี้แสดงให้เห็นว่าเราสามารถดึงข้อมูลและแสดงบันทึกจากตาราง 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;
      }

      /* 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;
}

เมื่อโปรแกรมที่กำหนดข้างต้นถูกคอมไพล์และดำเนินการโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -

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

อัปเดตการทำงาน

ส่วนรหัส C ต่อไปนี้แสดงให้เห็นว่าเราสามารถใช้คำสั่ง UPDATE เพื่ออัปเดตระเบียนใด ๆ จากนั้นดึงข้อมูลและแสดงบันทึกที่อัปเดตจากตาราง บริษัท ของเรา -

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

เมื่อโปรแกรมที่กำหนดข้างต้นถูกคอมไพล์และดำเนินการโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -

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

ลบการดำเนินการ

ส่วนรหัส C ต่อไปนี้แสดงวิธีที่เราสามารถใช้คำสั่ง DELETE เพื่อลบบันทึกใด ๆ จากนั้นดึงข้อมูลและแสดงระเบียนที่เหลือจากตาราง 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;
      }
      
      /* 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;
}

เมื่อโปรแกรมที่กำหนดข้างต้นถูกคอมไพล์และดำเนินการโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -

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