用qt从postgres读写图像(大对象)

时间:2019-04-28 03:14:03

标签: c++ postgresql qt blob large-data

我想使用框架qt在oid类型的postgres中读取和写入大对象,例如图像或视频。在查询中,我可以使用lo_import和lo_export读取和写入具有特定本地地址的大对象,以进行导入和导出。但是问题是如何使用qt和qsqlquery进行读写?

2 个答案:

答案 0 :(得分:0)

您可以将server side SQL functions用于大型对象,这些对象可由SELECT语句通过QSqlQuery::exec()调用。

要一次性读取或写入大对象,请参见lo_getlo_put

如果二进制数据足够大,您宁愿分块处理它们,请启动事务,然后循环使用lo_openloread / lowrite,{{1 }} ...

发送和检索的二进制数据的PostgreSQL类型为lo_close。将输入参数与bytea绑定时,应使用QSql::Binary,以便驱动程序在需要时相应地转义数据。

答案 1 :(得分:0)

假设您有一个名为“ 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
}

还要注意,记住表中文件的类型是您的责任。