Я хочу читать и писать большие объекты, такие как изображение или видео, в postgres с типом oid с фреймворком qt. В запросе я могу использовать lo_import и lo_export для чтения и записи больших объектов с определенным локальным адресом для импорта и экспорта. Но вопрос в том, как я могу читать и писать с помощью qt и qsqlquery?
Чтение и запись изображения (большой объект) из postgres с помощью qt
Ответы (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
}
Также обратите внимание, что вы обязаны помнить тип файла, который вы помещаете в таблицу.
Вы можете использовать функции SQL на стороне сервера для больших объектов, вызываемых SELECT
заявления через QSqlQuery::exec()
.
Чтобы прочитать или записать большой объект за один раз, см. lo_get
и lo_put
.
Если двоичные данные достаточно велики, чтобы вы предпочли обрабатывать их по частям, начать транзакцию, а затем использовать lo_open
, loread
/ lowrite
в цикле, lo_close
...
Тип отправляемых и получаемых двоичных данных PostgreSQL — bytea
. QSql::Binary
следует использовать при связывании входных параметров с QSqlQuery
, чтобы драйвер мог соответствующим образом экранировать данные, когда это необходимо.