Czy możesz podać przykład wstawiania danych binarnych w bazie danych PostgreSQL ze zdalnego komputera przy użyciu libpq. Moje drugie pytanie brzmi: czy istnieje inne API wydajniejsze niż libpq z C++. DziękiWstaw duży obiekt binarny (BLOB) w PostgreSQL za pomocą libpq ze zdalnego komputera
5
A
Odpowiedz
10
Istnieją 2 rodzaje bąble w PostgreSQL — BYTEA
i Large Objects
. Polecam, aby nie używać dużych obiektów, ponieważ nie można przyłączyć ich do tabel.
Dla bytea chcesz użyć czegoś takiego w 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;
}
1
Korzystanie libpqxx jest C++ sposób to zrobić, gdy jest libpq C API.
Oto pełna przykładów, jak to zrobić za pomocą pqxx: How to insert binary data into a PostgreSQL BYTEA column using the C++ libpqxx API?
W skrócie, istotne C++ linie używając libpqxx wyglądać następująco:
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();
Warto zauważyć, że są problemy starzenia się libpqxx, i nie, to nie jest "oficjalny" postgresql C++ api, jak stwierdza na stronie. – user3791372