在不同线程中具有SQLAlchemy查询的PyQT GUI

时间:2019-02-01 11:31:59

标签: python multithreading sqlalchemy qthread

我正在编写一个库存管理软件,该软件使用数据库来存储数据。我确实想进行循环查询以使接口保持最新。此外,我想在其他线程中执行查询,以避免阻塞gui。

到目前为止,我已经可以使用GUI了,并将由sqlalchemy管理的查询移到了不同​​的线程上。 GUI加载并由数据填充。不幸的是,当我尝试重新查询和更新时,发生了错误SQLite objects created in a thread can only be used in that same thread

def init_threads(self):
        self.data_thread = QtCore.QThread()
        self.mydata = Main_data()
        self.mydata.moveToThread(self.data_thread)
        self.data_thread.start()
        self.mydata.getchemical_finished.connect(self.update_result)

def init_connections(self):
        self.reset_btn.clicked.connect(self.mydata.getchemical)

class Main_data(QtCore.QObject):
   getchemical_finished = QtCore.pyqtSignal()

   def __init__(self):
       super(QtCore.QObject, self).__init__()
        self.engine = db.create_engine('data.db')
        self.session = sessionmaker(bind=self.engine)()

        @QtCore.pyqtSlot()
       def getchemical(self, chemical_id=None, chemical_name=None):
        if all(v is None for v in [chemical_id, chemical_name]):
            self.mychemicals = self.session.query(Chemical).all()
        elif chemical_name is not None:
            self.mychemical = self.session.query(Chemical).filter(Chemical.name == chemical_name).first()
        elif chemical_id is not None:
            self.mychemical = self.session.query(Chemical).filter(Chemical.id == chemical_id).first()
        self.getchemical_finished.emit() 

我试图在函数get_chemical中使用sess = scoped_session(self.session),但这并没有改变任何东西。 我已经阅读过使用flask-sqlalchemy,但是我以前从未使用过,我想知道,这是否正确?最好和最有效的方法是什么?为了实现对接口的更新,我将启动另一个线程,每x秒触发一次更新。

〜法比安

0 个答案:

没有答案