PostgreSQL - Giao diện C / C ++
Hướng dẫn này sẽ sử dụng libpqxxthư viện, là API ứng dụng khách C ++ chính thức cho PostgreSQL. Mã nguồn của libpqxx có sẵn theo giấy phép BSD, vì vậy bạn có thể tự do tải xuống, chuyển cho người khác, thay đổi, bán, đưa nó vào mã của riêng bạn và chia sẻ các thay đổi của bạn với bất kỳ ai bạn chọn.
Cài đặt
Bạn có thể tải xuống phiên bản mới nhất của libpqxx từ liên kết Tải xuống Libpqxx . Vì vậy, hãy tải xuống phiên bản mới nhất và làm theo các bước sau:
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
Trước khi bạn bắt đầu sử dụng giao diện C / C ++ PostgreSQL, hãy tìm pg_hba.conf trong thư mục cài đặt PostgreSQL của bạn và thêm dòng sau:
# IPv4 local connections:
host all all 127.0.0.1/32 md5
Bạn có thể khởi động / khởi động lại máy chủ postgres trong trường hợp nó không chạy bằng lệnh sau:
[root@host]# service postgresql restart
Stopping postgresql service: [ OK ]
Starting postgresql service: [ OK ]
API giao diện C / C ++
Sau đây là các quy trình giao diện quan trọng có thể đáp ứng yêu cầu của bạn để làm việc với cơ sở dữ liệu PostgreSQL từ chương trình C / C ++ của bạn. Nếu bạn đang tìm kiếm một ứng dụng phức tạp hơn thì bạn có thể xem tài liệu chính thức của libpqxx hoặc bạn có thể sử dụng các API có sẵn trên thị trường.
S. Không. | API & Mô tả |
---|---|
1 | pqxx::connection C( const std::string & dbstring ) Đây là một typedef sẽ được sử dụng để kết nối với cơ sở dữ liệu. Ở đây, dbstring cung cấp các tham số bắt buộc để kết nối với cơ sở dữ liệu, ví dụ:dbname = testdb user = postgres password=pass123 hostaddr=127.0.0.1 port=5432. Nếu kết nối được thiết lập thành công thì nó sẽ tạo C với đối tượng kết nối cung cấp các chức năng công cộng hữu ích khác nhau. |
2 | C.is_open() Phương thức is_open () là một phương thức công khai của đối tượng kết nối và trả về giá trị boolean. Nếu kết nối đang hoạt động, thì phương thức này trả về true nếu không thì trả về false. |
3 | C.disconnect() Phương pháp này được sử dụng để ngắt kết nối cơ sở dữ liệu đã mở. |
4 | pqxx::work W( C ) Đây là một typedef sẽ được sử dụng để tạo một đối tượng giao dịch bằng cách sử dụng kết nối C, cuối cùng sẽ được sử dụng để thực thi các câu lệnh SQL trong chế độ giao dịch. Nếu đối tượng giao dịch được tạo thành công, thì nó được gán cho biến W sẽ được sử dụng để truy cập các phương thức công khai liên quan đến đối tượng giao dịch. |
5 | W.exec(const std::string & sql) Phương thức công khai này từ đối tượng giao dịch sẽ được sử dụng để thực thi câu lệnh SQL. |
6 | W.commit() Phương thức công khai này từ đối tượng giao dịch sẽ được sử dụng để thực hiện giao dịch. |
7 | W.abort() Phương thức công khai này từ đối tượng giao dịch sẽ được sử dụng để khôi phục giao dịch. |
số 8 | pqxx::nontransaction N( C ) Đây là một typedef sẽ được sử dụng để tạo một đối tượng không giao dịch bằng cách sử dụng kết nối C, cuối cùng sẽ được sử dụng để thực thi các câu lệnh SQL trong chế độ không giao dịch. Nếu đối tượng giao dịch được tạo thành công, thì nó được gán cho biến N sẽ được sử dụng để truy cập các phương thức công khai liên quan đến đối tượng không giao dịch. |
9 | N.exec(const std::string & sql) Phương thức công khai này từ đối tượng không giao dịch sẽ được sử dụng để thực thi câu lệnh SQL và trả về một đối tượng kết quả thực sự là một số nguyên chứa tất cả các bản ghi được trả về. |
Kết nối với cơ sở dữ liệu
Đoạn mã C sau đây cho thấy cách kết nối với cơ sở dữ liệu hiện có đang chạy trên máy cục bộ tại cổng 5432. Ở đây, tôi đã sử dụng dấu gạch chéo ngược \ để tiếp tục dòng.
#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;
}
}
Bây giờ, chúng ta hãy biên dịch và chạy chương trình trên để kết nối với cơ sở dữ liệu của chúng ta testdb, đã có sẵn trong lược đồ của bạn và có thể được truy cập bằng cách sử dụng postgres của người dùng và mật khẩu pass123 .
Bạn có thể sử dụng ID người dùng và mật khẩu dựa trên cài đặt cơ sở dữ liệu của mình. Hãy nhớ giữ -lpqxx và -lpq theo thứ tự đã cho! Nếu không, trình liên kết sẽ phàn nàn một cách cay đắng về các chức năng bị thiếu với tên bắt đầu bằng "PQ."
$g++ test.cpp -lpqxx -lpq
$./a.out
Opened database successfully: testdb
Tạo bảng
Đoạn mã C sau sẽ được sử dụng để tạo bảng trong cơ sở dữ liệu đã tạo trướ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;
}
Khi chương trình đã cho ở trên được biên dịch và thực thi, nó sẽ tạo bảng COMPANY trong cơ sở dữ liệu testdb của bạn và sẽ hiển thị các câu lệnh sau:
Opened database successfully: testdb
Table created successfully
INSERT hoạt động
Đoạn mã C sau đây cho thấy cách chúng ta có thể tạo các bản ghi trong bảng COMPANY của chúng ta được tạo trong ví dụ trên:
#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;
}
Khi chương trình đã cho ở trên được biên dịch và thực thi, nó sẽ tạo các bản ghi đã cho trong bảng COMPANY và sẽ hiển thị hai dòng sau:
Opened database successfully: testdb
Records created successfully
CHỌN hoạt động
Đoạn mã C sau đây cho thấy cách chúng tôi có thể tìm nạp và hiển thị các bản ghi từ bảng COMPANY của chúng tôi được tạo trong ví dụ trên:
#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;
}
Khi chương trình đã cho ở trên được biên dịch và thực thi, nó sẽ tạo ra kết quả sau:
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ẬP NHẬT Hoạt động
Đoạn mã C sau đây cho thấy cách chúng ta có thể sử dụng câu lệnh UPDATE để cập nhật bất kỳ bản ghi nào, sau đó tìm nạp và hiển thị các bản ghi đã cập nhật từ bảng COMPANY của chúng ta -
#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;
}
Khi chương trình đã cho ở trên được biên dịch và thực thi, nó sẽ tạo ra kết quả sau:
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
Thao tác DELETE
Đoạn mã C sau đây cho thấy cách chúng ta có thể sử dụng câu lệnh DELETE để xóa bất kỳ bản ghi nào, sau đó tìm nạp và hiển thị các bản ghi còn lại từ bảng COMPANY của chúng ta -
#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;
}
Khi chương trình đã cho ở trên được biên dịch và thực thi, nó sẽ tạo ra kết quả sau:
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