数据库以BLOB
.
选择单元格并按下“下载文件...”按钮时,如何从数据库中卸载此文件?(代码旁边应该是test_BLOB.pdf)
最小的例子:
import sys
import os
from PySide2 import QtSql
from PySide2 import QtWidgets
from PySide2 import QtCore
class Storage_app(QtWidgets.QMainWindow):
def __init__(self, parent=None) -> None:
super().__init__()
self.createConnection()
self.fillTable() # !!! тестовое заполнение базы данных
self.createModel()
self.initUI()
self.centralWidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralWidget)
btn_save = QtWidgets.QPushButton("Скачать файл из БД")
btn_save.clicked.connect(self.save_file)
layout = QtWidgets.QVBoxLayout(self.centralWidget)
layout.addWidget(self.view)
layout.addWidget(btn_save)
if not parent:
self.show()
def save_file(self):
print("Как сохранить этот файл из базы данных? =(")
def createConnection(self):
self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName("local_base.db") # !!! .db
if not self.db.open():
print("Cannot establish a database connection")
return False
def fillTable(self):
"""
Вспомогательная функция заполнениия базы данных
Отключить после тестового запуска
"""
file_path = (f"{os.getcwd()}\\test_BLOB.pdf")
test_BLOB = self.convertToBinaryData(file_path)
test_BLOB = QtCore.QByteArray(test_BLOB)
self.db.transaction()
q = QtSql.QSqlQuery()
#
q.exec_("DROP TABLE IF EXISTS company;")
q.exec_("CREATE TABLE company ("
"id INT PRIMARY KEY, "
"name_company TEXT NOT NULL, "
"blob_data BLOB NOT NULL );")
# Вставка тестовых значений
query = QtSql.QSqlQuery()
query.prepare("INSERT INTO company (id, name_company, blob_data) "
"VALUES (:id, :name_company, :blob_data)")
query.bindValue(":id", 1)
query.bindValue(":name_company", 'АО КОПЫТА')
query.bindValue(":blob_data", test_BLOB)
query.exec_()
query = QtSql.QSqlQuery()
query.prepare("INSERT INTO company (id, name_company, blob_data) "
"VALUES (:id, :name_company, :blob_data)")
query.bindValue(":id", 2)
query.bindValue(":name_company", 'АО РОГА')
query.bindValue(":blob_data", test_BLOB)
query.exec_()
self.db.commit()
def createModel(self):
"""
Создание модели для отображения
"""
self.model = QtSql.QSqlRelationalTableModel()
self.model.setTable("company")
self.model.setHeaderData(0, QtCore.Qt.Horizontal, "id")
self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Наиманование")
self.model.setHeaderData(2, QtCore.Qt.Horizontal, "Документы")
self.model.select()
def initUI(self):
self.view = QtWidgets.QTableView()
self.view.setModel(self.model)
mode = QtWidgets.QAbstractItemView.SingleSelection
self.view.setSelectionMode(mode)
def closeEvent(self, event):
if (self.db.open()):
self.db.close()
def convertToBinaryData(self, file_path):
# Конвертирование в BLOB
with open(file_path, 'rb') as file:
blobData = file.read()
return blobData
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
app.setStyle('Fusion')
w = Storage_app()
app.exec_()
试试这样: