อ่านและเขียนรูปภาพ (วัตถุขนาดใหญ่) จาก postgres ด้วย qt

ฉันต้องการอ่านและเขียนวัตถุขนาดใหญ่ เช่น รูปภาพหรือวิดีโอใน postgres ด้วยประเภท oid พร้อมเฟรมเวิร์ก qt ในแบบสอบถาม ฉันสามารถใช้ lo_import และ lo_export เพื่ออ่านและเขียน largeobject พร้อมที่อยู่ในเครื่องเฉพาะสำหรับการนำเข้าและส่งออก แต่คำถามคือฉันจะอ่านและเขียนด้วย qt และ qsqlquery ได้อย่างไร


person ebigood    schedule 28.04.2019    source แหล่งที่มา


คำตอบ (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
}

โปรดทราบว่าเป็นความรับผิดชอบของคุณที่จะต้องจดจำประเภทของไฟล์ที่คุณใส่ไว้ในตาราง

person lena    schedule 29.05.2019

คุณสามารถใช้ ฟังก์ชัน SQL ฝั่งเซิร์ฟเวอร์ สำหรับวัตถุขนาดใหญ่ เรียกได้โดย SELECT คำสั่งถึง QSqlQuery::exec()

หากต้องการอ่านหรือเขียนวัตถุขนาดใหญ่ในครั้งเดียว โปรดดูที่ lo_get และ lo_put

หากข้อมูลไบนารีมีขนาดใหญ่พอที่คุณต้องการประมวลผลเป็นชิ้น ให้เริ่มธุรกรรม จากนั้นใช้ lo_open, loread / lowrite ในลูป lo_close...

ประเภท PostgreSQL ของข้อมูลไบนารีที่ส่งและดึงมาคือ bytea QSql::Binary ควรใช้เมื่อรวมพารามิเตอร์อินพุตด้วย QSqlQuery เพื่อให้ไดรเวอร์หลีกเลี่ยงข้อมูลตามที่จำเป็น

person Daniel Vérité    schedule 28.04.2019