ฉันต้องการอ่านและเขียนวัตถุขนาดใหญ่ เช่น รูปภาพหรือวิดีโอใน postgres ด้วยประเภท oid พร้อมเฟรมเวิร์ก qt ในแบบสอบถาม ฉันสามารถใช้ lo_import และ lo_export เพื่ออ่านและเขียน largeobject พร้อมที่อยู่ในเครื่องเฉพาะสำหรับการนำเข้าและส่งออก แต่คำถามคือฉันจะอ่านและเขียนด้วย qt และ qsqlquery ได้อย่างไร
อ่านและเขียนรูปภาพ (วัตถุขนาดใหญ่) จาก postgres ด้วย qt
คำตอบ (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
}
โปรดทราบว่าเป็นความรับผิดชอบของคุณที่จะต้องจดจำประเภทของไฟล์ที่คุณใส่ไว้ในตาราง
คุณสามารถใช้ ฟังก์ชัน SQL ฝั่งเซิร์ฟเวอร์ สำหรับวัตถุขนาดใหญ่ เรียกได้โดย SELECT
คำสั่งถึง QSqlQuery::exec()
หากต้องการอ่านหรือเขียนวัตถุขนาดใหญ่ในครั้งเดียว โปรดดูที่ lo_get
และ lo_put
หากข้อมูลไบนารีมีขนาดใหญ่พอที่คุณต้องการประมวลผลเป็นชิ้น ให้เริ่มธุรกรรม จากนั้นใช้ lo_open
, loread
/ lowrite
ในลูป lo_close
...
ประเภท PostgreSQL ของข้อมูลไบนารีที่ส่งและดึงมาคือ bytea
QSql::Binary
ควรใช้เมื่อรวมพารามิเตอร์อินพุตด้วย QSqlQuery
เพื่อให้ไดรเวอร์หลีกเลี่ยงข้อมูลตามที่จำเป็น