Предположим, у вас есть таблица с именем "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
}
Также обратите внимание, что вы обязаны запомнить тип файла, который вы положили в таблицу.