Чтение и запись изображения (большой объект) из postgres с помощью qt - PullRequest
0 голосов
/ 28 апреля 2019

Я хочу читать и писать большие объекты, такие как изображения или видео, в postgres с типом oid с каркасом qt.В запросе я могу использовать lo_import и lo_export для чтения и записи большого объекта с определенным локальным адресом для импорта и экспорта.Но вопрос в том, как я могу читать и писать с помощью qt и qsqlquery?

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Предположим, у вас есть таблица с именем "my_table" . Для хранения больших двоичных объектов в PostgreSQL рекомендуется использовать тип bytea для поля данных, поэтому назовите его "binary_data" .

Для вставки данных я бы использовал QSqlRecord, например:

QSqlTableModel *model;
QSqlDatabase m_database;
m_database = ...//connect to the database here
model = new QSqlTableModel(0, m_database);
model->setTable("my_table");
model->select();
QSqlRecord rec;
rec = model->record();
QFile f("path_to_a_big_file");
if(f.open(QIODevice::ReadOnly))
{
    QByteArray ba = f.readAll();
    rec.setValue("binary_data",ba.toBase64());
}
model->insertRecord(-1,rec);
model->submitAll();

Для обновления данных QSqlQuery сделает:

QSqlQuery query(m_database);
query.prepare("update my_table set binary_data = :binary_data where [condition]....");
QFile f("path_to_a_big_file");
if(f.open(QIODevice::ReadOnly))
{
    QByteArray ba = f.readAll();
    query.bindValue(":binary_data",ba.toBase64());
}
query.exec();

И, наконец, для чтения данных вам нужно сделать что-то вроде этого:

QSqlTableModel *model;
model = new QSqlTableModel(0, m_database);
model->setTable("my_table");
model->select();
 while(model->canFetchMore())
    model->fetchMore();
for (int i = 0; i < model->rowCount(); ++i)
{
    QByteArray ba = QByteArray::fromBase64(model->record(i).value("binary_data").toByteArray())
    //do something with the retrieved data
}

Также обратите внимание, что вы обязаны запомнить тип файла, который вы положили в таблицу.

0 голосов
/ 29 апреля 2019

Вы можете использовать функции SQL на стороне сервера для больших объектов, которые можно вызывать с помощью операторов SELECT через QSqlQuery::exec().

Чтобы прочитать или записать большой объект за один раз, см.lo_get и lo_put.

Если двоичные данные достаточно велики, чтобы вы предпочли обработать их порциями, запустите транзакцию, а затем используйте lo_open, loread / lowrite вloop, lo_close ...

Тип PostgreSQL для двоичных данных, отправляемых и извлекаемых, - bytea.QSql::Binary следует использовать при связывании входных параметров с QSqlQuery, чтобы драйвер мог соответствующим образом экранировать данные при необходимости.

...