Tôi đã đưa ra giải pháp linh hoạt sử dụng dữ liệu nhị phân bên trong std::string
.
Tôi đề xuất giải pháp mới này vì câu trả lời hiện tại là cũ (2013) và tôi đang tìm kiếm truy vấn chèn nhiều bằng pqxx 5.0.1.
Với giải pháp dưới đây, bạn có thể linh hoạt sử dụng for loop
để nối thêm nhiều dữ liệu nhị phân trong một truy vấn chèn đơn.
CustomStruct data = .... ; // have some binary data
// initialise connection and declare worker
pqxx::connection conn = new pqxx::connection(...);
pqxx::work w(conn);
// prepare query
string query += "INSERT INTO table (bytea_field) VALUES ("
// convert your data in a binary string.
pqxx::binarystring blob((void *)&(data), data.size());
// avoid null character to bug your query string.
query += "'"+w.esc_raw(blob.str())+"');";
//execute query
pqxx::result rows = w.exec(query);
Khi chúng ta muốn lấy dữ liệu từ cơ sở dữ liệu, bạn nên có phạm vi datatype của bạn (CustomStruct
ví dụ) và bạn sẽ có thể bỏ nó trở lại trong định dạng nhị phân của sự lựa chọn của bạn.
// assuming worker and connection are declared and initialized.
string query = "SELECT bytea_field FROM table;";
pqxx::result rows = w.exec(query);
for(pqxx::result::iterator col = rows.begin(); col != rows.end(); ++col)
{
pqxx::binarystring blob(col[0]);
CustomStruct *data = (CustomStruct*) blob.data();
...
}
này đã được thử nghiệm với pqxx 5.0.1
, c++11
và postgresSQL 9.5.8
Tôi thích giải pháp của bạn, nhưng tôi không thích bằng cách sử dụng conn.prepare. Nó giới hạn tôi khi tôi có phần tử 'n' để chèn với một truy vấn (vấn đề hiệu năng). Tôi đang làm việc trên một giải pháp (với pqxx 5.0.1). – LAL