Можете ли вы привести пример вставки двоичных данных в базу данных PostgreSQL с удаленного компьютера с помощью libpq. Мой второй вопрос: есть ли какой-либо другой API более эффективный, чем libpq с C++. Спасибо
Вставьте большой двоичный объект (BLOB) в PostgreSQL, используя libpq с удаленного компьютера
Ответы (2)
В PostgreSQL есть 2 типа BLOB-объектов: BYTEA
и Large Objects
. Я бы рекомендовал не использовать большие объекты, так как вы не можете присоединять их к таблицам.
Для BYTEA вы должны использовать что-то вроде этого в libpq:
PGresult* put_data_to_tablename(
PGconn* conn,
int32_t id,
int data_size,
const char* const data
) {
PGresult* result;
const uint32_t id_big_endian = htonl((uint32_t)id);
const char* const paramValues[] = { &id_big_endian, data };
const int nParams = sizeof(paramValues) / sizeof(paramValues[0]);
const int paramLenghts[] = { sizeof(id_big_endian), data_size };
const int paramFormats[] = { 1, 1 }; /* binary */
const int resultFormat = 0; /* text */
result = PQexecParams(
conn,
"insert into tablename (id, data) values ($1::integer, $2::bytea)",
nParams,
NULL, /* Types of parameters, unused as casts will define types */
paramValues,
paramLenghts,
paramFormats,
resultFormat
);
return result;
}
person
Tometzky
schedule
24.01.2012
Использование libpqxx — это способ сделать это на C++, а libpq — это C API.
Вот полный пример того, как это сделать с помощью pqxx: using-the-c-libpqxx-a">Как вставить двоичные данные в столбец PostgreSQL BYTEA с помощью C++ libpqxx API?
Короче говоря, соответствующие строки C++, использующие libpqxx, выглядят так:
void * bin_data = ...; // obviously do what you need to get the binary data...
size_t bin_size = ...; // ...and the size of the binary data
pqxx::binarystring bin( bin_data, bin_size );
pqxx::result r = work.prepared( "test" )( bin ).exec();
work.commit();
person
Stéphane
schedule
21.04.2013
Стоит отметить, что у libpqxx есть проблемы со старением, и нет, это не официальный API-интерфейс postgresql c++, как указано на сайте.
- person user3791372; 17.08.2014