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