PyQt5 QSqlDatabase Postgresql Сообщение об ошибке: Q PSQL драйвер не загружен - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь подключиться к моей Postgresql базе данных через Qt5 QSqlDatabase. БД работает, и я уже написал работающий интерфейсный модуль для БД, который использует модуль psycopg2. Но теперь я хочу использовать интерфейс qt, чтобы использовать материал Qt Tableview.

я установил:

  • Anaconda 2019.10 Python3 .7 64Bit
  • Создано новое имя среды conda py3env1
  • переключено на py3env1
  • установлено python: установлено conda python
  • установлено pyqt: установлено conda - c anaconda pyqt

Я работаю над Windows10.

Это мой код:

import sys
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
from PyQt5.QtWidgets import QMainWindow, QTableView, QApplication, QDialog
from PyQt5.QtCore import QTimer, QObject, QThread, QCoreApplication



class cStateMachine(QObject):

    def __init__(self):
        QObject.__init__(self)

         # Timer for cyclic start of self.stateMachine()
        self.timerEnabled = False
        self.stateMachineTimer = QTimer()

    def start(self):
        print ('cStateMachine.start()')
        self.timerEnabled = True
        self.stateMachineTimer.singleShot(500, self.stateMachine)

    def stateMachine(self):

        try:
            print(QCoreApplication.libraryPaths())
            result = QSqlDatabase.isDriverAvailable('QPSQL')   
            print("PostgreSQL-Treiber verfügbar? {}".format(result))  
            db = QSqlDatabase.addDatabase("QPSQL")
            ret = db.setDatabaseName("testdb")
            db.setHostName("localhost")
            db.setUserName("postgres")
            db.setPassword("1234")
            print(ret)
            if db.open():
                print("connected")
            else:
                print("connection failed")
                print("Text: " + db.lastError().text())
                print("Type: " + str(db.lastError().type()))
                print("Number: " + str(db.lastError().number()))
        except:
            print("Exception")
        """ Timer starten damit Funktion nach Zeit x wieder betreten wird"""

        #print("timerEnabled=" + str(self.timerEnabled))
        if self.timerEnabled == True:
            timeMs = 500

            #self.stateMachineTimer.singleShot(timeMs, self.stateMachine)


class Form(QDialog):

    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        self.setWindowTitle("My Form")

        self.threadStateMachine = QThread()
        self.stateMachine = cStateMachine()
        """ Thread stuff """
        self.stateMachine.moveToThread(self.threadStateMachine)
        self.threadStateMachine.start()
        self.stateMachine.start()


if __name__ == '__main__':
    # Create the Qt Application
    app = QApplication(sys.argv)
    # Create and show the form
    form = Form()
    form.show()

    print("Ende")
    # Run the main Qt loop
    sys.exit(app.exec_())

Теперь я получаю эту ошибку:

Got keys from plugin meta data ("QODBC3", "QODBC")
QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/user/.conda/envs/py3env1/sqldrivers" ...
PostgreSQL-Treiber verfügbar? False
QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3
None
connection failed
Text: Driver not loaded Driver not loaded
Type: 1
Number: -1

Я не знаком со структурой папок Anaconda python. Но, насколько я понимаю, файл qsqlpqql.dll должен находиться внутри Qt \ plugins \ sqldrivers \ Q SQLPSQL .DLL где-то внутри папки среды py3env1. Но этот файл не существует. В ПУТИ я добавил пути к D: \ Program Files \ PostgreSQL \ 11 \ bin и D: \ Program Files \ PostgreSQL \ 11 \ lib.

Я не знаю, как отлаживать с этого момента. Как я понимаю сейчас, мой код python включает модули pyqt5, которые являются python модулями, которые каким-то образом включают dll из библиотеки qt. И модули python, и весь qt устанавливаются в мою виртуальную среду "py3env1". И Qt Sql dll должен использовать Postgres DLL из папки Postgres.

Это действительно расстраивает, потому что анаконда, кажется, не так прямолинейна, как обещано. Я чувствую, хотя есть менеджер пакетов conda, процесс установки пакетов глючит.

...