PyQT GUI с SQLAlchemy Query в другом потоке - PullRequest
0 голосов
/ 01 февраля 2019

Я пишу программное обеспечение для управления запасами, которое использует базу данных для хранения данных.Я хочу делать повторяющиеся запросы, чтобы поддерживать интерфейс в актуальном состоянии.Более того, я хочу выполнять запросы в другом потоке, чтобы избежать блокировки графического интерфейса.

Пока у меня работает графический интерфейс, и я переместил запросы, управляемые sqlalchemy, в другой поток.Графический интерфейс загружается и заполняется данными.К сожалению, ошибка 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() 

Я пытался использовать sess = scoped_session (self.session) в функции get_chemical, но это ничего не изменило.Я читал, чтобы использовать колбу-sqlalchemy, но я не использовал ее раньше, и я хотел бы знать, если это будет правильный путь в любом случае?Что будет лучшим и наиболее эффективным способом?Чтобы реализовать обновления интерфейса, я бы запустил другой поток, который запускает обновление каждые x секунд.

~ Fabian

...