【问题标题】:Error: "Driver not loaded" in PyQt5错误:PyQt5 中的“驱动程序未加载”
【发布时间】:2018-08-13 00:59:30
【问题描述】:

我即将将 PyQt5 连接到 MySQL。不幸的是,我收到错误“未加载驱动程序”。 Python 说驱动程序在里面:

from PyQt5.QtSql import QSqlDatabase
print(list(map(str, QSqlDatabase.drivers())))

答案:['QSQLITE', 'QMYSQL', 'QMYSQL3', 'QODBC', 'QODBC3', 'QPSQL', 'QPSQL7'] 我使用的是 Windows 7 并安装了 Qt Designer

这是我的代码:

from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
from PyQt5.QtWidgets import QTableView, QApplication
import sys
app = QApplication(sys.argv)
db = QSqlDatabase.addDatabase('QMYSQL')
db.setHostName('****')
db.setDatabaseName('****')
db.setUserName('****')
db.setPassword('****')
ok = db.open()
if not ok: print(db.lastError().text())
else: print("connected")
query = QSqlQuery(db);
query.exec_('SELECT * FROM tbl_Customers');

谁有这方面的经验。非常感谢

【问题讨论】:

    标签: python mysql pyqt pyqt5


    【解决方案1】:

    我通过安装 PyQt5 的 12.0 版而不是 14 版解决了这个问题。 如果您将 libmysql.dll 的副本放在项目文件夹中也可能会有所帮助

    【讨论】:

    • 这应该是一条评论
    【解决方案2】:

    从提升的命令提示符运行:

    o 任何一个:pip install --only-binary :all: mysqlclient
    o 或者:首先安装构建工具https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2017 然后运行:pip install mysqlclient)(这个选项需要你下载一个4gb+的文件)

    完成后,您可以像这样连接:

    from PyQt5 import QtSql
    import mysql.connector
    
    class DbConnection(object):
        def connect(self):
            try:
                self.__db = QtSql.QSqlDatabase.addDatabase("QMYSQL")
                self.__db.setHostName("localhost")
                self.__db.setDatabaseName("yourDB")
                self.__db.setUserName("root")
                self.__db.setPassword("yourPassword")
                self.__ok = self.__db.open()
            except:
                print(self.__db.lastError().text())
    
            return self.__ok
    
        def closeConnection(self):
            try:
                self.__db.close()
            except:
                pass
    
    if __name__ == "__main__":
        from PyQt5 import QtWidgets
        import sys
        app = QtWidgets.QApplication(sys.argv)
    
        conn = DbConnection()
        print("Connected: " + str(conn.connect()))
        conn.closeConnection()
    
        sys.exit(app.exec_())
    

    【讨论】:

      【解决方案3】:

      我像这样将 PyQt5 连接到 MySQL:

      from PyQt5       import QtCore, QtGui, QtWidgets
      #from PyQt5.QtSql import QSqlDatabase, QSqlQuery
      import MySQLdb   as mysql                  # pip install mysqlclient        
      
      
      def convert(in_data):
          def cvt(data):
              try:
                  return ast.literal_eval(data)
              except Exception:
                  return str(data)
          return tuple(map(cvt, in_data))
      
      
      class Ui_MainWindow(object):
      
          def loadconection(self):
              #                        HostName     UserName           Password      DatabaseName
              db = mysql.connect(host="localhost",user="user", passwd="password",db="testdb")
              with db:
                  cur = db.cursor()
                  #                             table vvvvvvvvv         
                  rows = cur.execute("""select * from pyqt5data""")
                  data = cur.fetchall()
      
                  for row in data:
                      self.add_table(convert(row))
      
                  cur.close()
      
          def add_table(self, columns):
              rowPosition = self.tableWidget.rowCount()
              self.tableWidget.insertRow(rowPosition)         
              for i, column in enumerate(columns):
                  self.tableWidget.setItem(rowPosition, i, QtWidgets.QTableWidgetItem(str(column)))
      
          def setupUi(self, MainWindow):
              MainWindow.setObjectName("MainWindow")
              MainWindow.resize(800, 520)
              self.centralwidget = QtWidgets.QWidget(MainWindow)
              self.centralwidget.setObjectName("centralwidget")
              self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
              self.tableWidget.setGeometry(QtCore.QRect(35, 21, 731, 401))
              self.tableWidget.setColumnCount(5)
              self.tableWidget.setHorizontalHeaderLabels(['Id', 'Name', 'Email', 'Phone', 'Note'])
              self.tableWidget.setObjectName("tableWidget")
              self.tableWidget.setAlternatingRowColors(True)
              self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
      
              self.btn_abrirbd2 = QtWidgets.QPushButton(self.centralwidget)
              self.btn_abrirbd2.setGeometry(QtCore.QRect(340, 460, 75, 23))
              self.btn_abrirbd2.setObjectName("btn_abrirbd2")
              self.btn_abrirbd2.clicked.connect(self.loadconection)
      
              MainWindow.setCentralWidget(self.centralwidget)
              self.menubar = QtWidgets.QMenuBar(MainWindow)
              self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
              self.menubar.setObjectName("menubar")
              MainWindow.setMenuBar(self.menubar)
              self.statusbar = QtWidgets.QStatusBar(MainWindow)
              self.statusbar.setObjectName("statusbar")
              MainWindow.setStatusBar(self.statusbar)
      
              self.retranslateUi(MainWindow)
              QtCore.QMetaObject.connectSlotsByName(MainWindow)
      
          def retranslateUi(self, MainWindow):
              _translate = QtCore.QCoreApplication.translate
              MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
              self.btn_abrirbd2.setText(_translate("MainWindow", "SELECT mysql"))
      
      if __name__ == "__main__":
          import sys
          app = QtWidgets.QApplication(sys.argv)
          MainWindow = QtWidgets.QMainWindow()
          ui = Ui_MainWindow()
          ui.setupUi(MainWindow)
          MainWindow.show()
          sys.exit(app.exec_())
      

      【讨论】:

      • 这并没有回答问题,这是关于如何将 MySql 与 QSqlDatabaseQSqlQuery 类一起使用。
      【解决方案4】:

      问题出在应用程序启动过程中。对于 PyQt,您需要启动一个 GUI 应用程序,然后才能真正使用它下面的类。要记住的另一件事是,始终尝试查看实际错误。在您的情况下,您正在强制使用 lastError() 方法并且在此之前错过了一些有价值的点。您只看到Driver not loaded 错误。但是之前那个终端也显示QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins这个错误,清楚地说明了驱动找不到的实际原因。

      要制作一个 QCoreApplication,你需要在你的代码中添加这个 -

      if __name__ == '__main__':
         app = QApplication(sys.argv)
      

      所以你的代码可以是 -

      from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
      from PyQt5.QtWidgets import QTableView, QApplication
      import sys
      
      
      def dbcon():
          db = QSqlDatabase.addDatabase('QMYSQL')
          db.setHostName('****')
          db.setDatabaseName('****')
          db.setUserName('****')
          db.setPassword('****')
          ok = db.open()
          if not ok: print(db.lastError().text())
          # else: print("connected")
          query = QSqlQuery(db)
          query.exec_('SELECT * FROM tbl_Customers')
      
      
      if __name__ == '__main__':
          app = QApplication(sys.argv)
          dbcon()
      

      我用 SQlite 数据库做了一个示例,因为我没有配置 MySql。演示 -

      from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
      from PyQt5.QtWidgets import QTableView, QApplication, QMessageBox
      
      
      def createDB():
          db = QSqlDatabase.addDatabase('QSQLITE')
          db.setDatabaseName('sports.db')
          if not db.open():
              QMessageBox.critical(None, ("Cannot open database"),
                                         ("Unable to establish a database connection.\n"
                                                       "This example needs SQLite support. Please read "
                                                       "the Qt SQL driver documentation for information "
                                                       "how to build it.\n\n"
                                                       "Click Cancel to exit."),
                                         QMessageBox.Cancel)
          return False
      
          query = QtSql.QSqlQuery()
          query.exec_("create table sportsmen(id int primary key, "
                      "firstname varchar(20), lastname varchar(20))")
          query.exec_("insert into sportsmen values(101, 'Roger', 'Federer')")
          query.exec_("insert into sportsmen values(102, 'Christiano', 'Ronaldo')")
          query.exec_("insert into sportsmen values(103, 'Ussain', 'Bolt')")
          query.exec_("insert into sportsmen values(104, 'Sachin', 'Tendulkar')")
          query.exec_("insert into sportsmen values(105, 'Saina', 'Nehwal')")
          return True
      
      
      if __name__ == '__main__':
          import sys
      
          app = QApplication(sys.argv)
          createDB()
      

      【讨论】:

      • 但是 OPs 代码显然确实创建了一个应用对象(见第 4 行)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 2011-06-21
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多