Я придумал гибкое решение, используя двоичные данные внутри std::string
.
Я предлагаю это новое решение, потому что текущие ответы старые (2013), и я искал многопользовательский запрос с использованием pqxx 5.0.1.
С решением ниже вы можете использовать for loop
для добавления нескольких двоичных данных в один запрос на вставку.
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);
Когда мы хотим, чтобы извлечь данные из базы данных, вы должны иметь объем вашего типа данных (CustomStruct
, например), и вы должны быть в состоянии бросить его обратно в двоичном формате по вашему выбору.
// 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();
...
}
Это была протестирована с pqxx 5.0.1
, c++11
и postgresSQL 9.5.8
мне нравится ваше решение, но я не люблю, используя conn.prepare. Это ограничивает меня, когда у меня есть элемент 'n' для вставки с одним запросом (проблема с производительностью). Я работаю над решением (с pqxx 5.0.1). – LAL