Чтение и запись изображения (большой объект) из postgres с помощью qt

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


person ebigood    schedule 28.04.2019    source источник


Ответы (2)


Предположим, у вас есть таблица с именем "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
}

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

person lena    schedule 29.05.2019

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

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

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

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

person Daniel Vérité    schedule 28.04.2019