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?
Baca dan tulis gambar (objek besar) dari postgres dengan qt
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.
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.