首页 > 解决方案 > 尝试使用 python 3.7 (x64) 连接到 pyqt5 中的 SQL 数据库时出现“未加载驱动程序”

问题描述

我尝试将旧的 pyqt4 程序转换为 pyqt5 并更改为 python x64。

第一次查询数据库时,出现“未加载驱动程序”错误。

当我使用 mysql.connector.connect 时,我可以毫无问题地从数据库中获取数据。

我在过去的四个晚上尝试解决这个问题,目前,不知道更多。

我尝试过的事情:

我相信我的问题之一是 print(QtSql.QSqlDatabase.drivers()) 只给了我: ['QSQLITE', 'QODBC', 'QODBC3', 'QPSQL', 'QPSQL7']

在相应的文件夹中(据我了解)“C:\Python37\Lib\site-packages\PyQt5\Qt\plugins\sqldrivers”只有以下三个文件:qsqlite.dll,qsqlodbc.dll,qsqlpsql.dll

我从https://raw.githubusercontent.com/pyqt/python-qt5/master/PyQt5/plugins/sqldrivers/下载了 qsqlmysql.dll 文件,之后用 print(QtSql.QSqlDatabase .drivers()) ,但是有了这个文件,我的 python 崩溃了。

接下来我可以尝试什么?我做错了什么?

数据库是“服务器版本:5.5.57-MariaDB - MariaDB 服务器”

from PyQt5 import QtCore, QtGui, QtWidgets, uic, QtSql

from PyQt5.QtSql import (QSql, QSqlDatabase, QSqlDriver,
    QSqlDriverCreatorBase, QSqlError, QSqlField, QSqlIndex, QSqlQuery,
    QSqlQueryModel, QSqlRecord, QSqlRelation, QSqlRelationalDelegate,
    QSqlRelationalTableModel, QSqlResult, QSqlTableModel)


class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
    QtWidgets.QMainWindow.__init__(self)
    Ui_MainWindow.__init__(self)
    self.setupUi(self)

    self.db_connection = QSqlDatabase.database()
    print(QtSql.QSqlDatabase.drivers())
    self.db_connection = QSqlDatabase.addDatabase("QMYSQL")
    self.db_connection.setHostName(db_sql_server_ip)
    self.db_connection.setDatabaseName(db_db_name)
    self.db_connection.setUserName(db_user)
    self.db_connection.setPassword(db_pw)
    self.db_connection.setPort(int(db_sql_server_port))
    self.db_connection.setConnectOptions("MYSQL_OPT_RECONNECT=1")


    # first function which will get sql data
    query = QSqlQuery()

    # for demonstration
    self.setting_name='123'

    query.prepare("SELECT name,settings_value,pickled_data FROM settings WHERE user_id = ? AND active='1' AND name = ?")
    query.addBindValue(_user_id)
    query.addBindValue(self.setting_name)   

    query_status = query.exec_()
    if query_status is not True:
        errorText = query.lastError().text()
        QtWidgets.QMessageBox.critical(self, 'Query error', errorText + str(57))     

没有qt的代码可以访问sql:

    # the following works, but I need qt..
    import mysql.connector

    db = mysql.connector.connect(host=db_sql_server_ip,  # your host, usually localhost
                         user=db_user,  # your username
                         passwd=db_pw,  # your password
                         db=db_db_name)  # name of the data base

    # you must create a Cursor object. It will let
    #  you execute all the queries you need
    cur = db.cursor()

    # Use all the SQL you like
    cur.execute("SELECT * FROM users")

    # print all the first cell of all the rows
    for row in cur.fetchall():
        print(row[0])

    db.close()

标签: pythonmysqlpython-3.xpyqt5

解决方案


推荐阅读