Я пытаюсь подключиться к моей 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, процесс установки пакетов глючит.