Baca dan tulis gambar (objek besar) dari postgres dengan qt

Saya ingin membaca dan menulis objek besar seperti gambar atau video di postgres dengan tipe oid dengan framework qt. Dalam kueri saya dapat menggunakan lo_import dan lo_export untuk membaca dan menulis objek besar dengan alamat lokal tertentu untuk impor dan ekspor. Tapi pertanyaannya adalah bagaimana saya bisa membaca dan menulis dengan qt dan qsqlquery?


person ebigood    schedule 28.04.2019    source sumber


Jawaban (2)


Anggaplah Anda memiliki tabel bernama "my_table". Untuk menyimpan objek biner besar dengan PostgreSQL disarankan menggunakan tipe bytea untuk bidang data, jadi beri nama "binary_data".

Untuk memasukkan data saya akan menggunakan QSqlRecord, seperti ini:

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();

Untuk memperbarui data QSqlQuery akan dilakukan:

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();

Dan terakhir untuk membaca data Anda perlu melakukan sesuatu seperti ini:

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
}

Perhatikan juga bahwa Anda bertanggung jawab untuk mengingat jenis file yang Anda masukkan ke dalam tabel.

person lena    schedule 29.05.2019

Anda dapat menggunakan fungsi SQL sisi server untuk objek besar, yang dapat dipanggil oleh SELECT pernyataan sampai QSqlQuery::exec().

Untuk membaca atau menulis objek besar sekaligus, lihat lo_get dan lo_put.

Jika data biner cukup besar sehingga Anda lebih suka memprosesnya per bagian, mulailah transaksi, lalu gunakan lo_open, loread / lowrite dalam satu lingkaran, lo_close...

Tipe PostgreSQL dari data biner yang dikirim dan diambil adalah bytea. QSql::Binary harus digunakan saat mengikat parameter input dengan QSqlQuery, agar driver dapat melepaskan data yang sesuai bila diperlukan.

person Daniel Vérité    schedule 28.04.2019