Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQT5 tableWidget中MSSQL数据加载缓慢_Python_Mysql_Pyqt5 - Fatal编程技术网

Python PyQT5 tableWidget中MSSQL数据加载缓慢

Python PyQT5 tableWidget中MSSQL数据加载缓慢,python,mysql,pyqt5,Python,Mysql,Pyqt5,我正在创建一个GUI应用程序,使用PyQt5和MSSQL作为数据库服务器。我能够在2秒钟内轻松连接MSSQL服务器,但当我使用简单的select查询加载数据时,它需要10秒钟,通常最多需要2秒钟。我不知道我的代码哪里出错了 我的代码结构: main.py(由.ui生成) connection.py(数据库连接) mainApp.py(其中tablewidget、信号槽被继承) 数据处理程序(加载数据/sql查询) 连接.py from PyQt5.QtSql import QSqlDatabas

我正在创建一个GUI应用程序,使用PyQt5和MSSQL作为数据库服务器。我能够在2秒钟内轻松连接MSSQL服务器,但当我使用简单的select查询加载数据时,它需要10秒钟,通常最多需要2秒钟。我不知道我的代码哪里出错了

我的代码结构:

  • main.py(由.ui生成)
  • connection.py(数据库连接)
  • mainApp.py(其中tablewidget、信号槽被继承)
  • 数据处理程序(加载数据/sql查询)
  • 连接.py

    from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
    from PyQt5.QtWidgets import QTableView, QApplication,QMessageBox, QLabel
    import sys
    
    USERNAME = '********'
    PASSWORD = '******'
    DATABASE = ''
    
    def selectedServer(server):
        switcher = {
            'Server 1': '1**.1*.7*.1*,1433',
            'Server 2': '1**.1*.7*.1*,1433',
        }
        return switcher.get(server, "Invalid Server ")
    
    def createConnection(self, server):
    
        SERVER = selectedServer(server)
        global db
        db = QSqlDatabase.addDatabase('QODBC')
        db.setDatabaseName(f'Driver={{SQL SERVER}}; Server={SERVER}; UID={USERNAME}; PWD={PASSWORD};')
        if db.open():
            print(f'{server} Server connected successfully')
            QMessageBox.about(self, 'Connection',f'{server} Server connected successfully')
            return True
        else:
            print(f'{server} connection failed')
            return False
    #loading data---------------
    def loadData(query_string):
      
        query = QSqlQuery(db)
        res = query.exec(query_string)
        record = query.record()
        column_number= record.count()
        
        header_list=[]
        for i in range(column_number):
            header_list.append(record.field(i).name())
        result_list = []
    
        while query.next():
            sublist =[]
            for i in range(column_number):
                sublist.append(query.value(i))
            result_list.append(sublist)
        
        return [header_list,result_list]
    
        from connection.connection import *
        from PyQt5 import QtCore, QtGui, QtWidgets
        from  PyQt5.QtWidgets import *
        
        def loadInsightAccount(input_value,type_value):
        
             if type_value=="AccountID":
                print("True")
                
                query_string="SELECT convert(int,iinsightaccountid) as AccountID,* from AccountMaster.dbo.Accounttable(nolock) where iinsightAccountID="+input_value
                print(query_string)
                InsightAcc_data=loadData(query_string)
        
                header_list = InsightAcc_data[0]
                value_list =  InsightAcc_data[1]
                # print(header_list)
                # print(value_list)
        
                return (InsightAcc_data)
    
    def insightAccountCall(self):
                    print("Loading insight Account datas...")    
                    
                    input_value=self.account_lineEdit.text()
                    type_value=str(self.account_comboBox.currentText())
                   
                    accountData2=loadInsightAccount(input_value,type_value)
            
                    header_list = accountData2[0]
                    value_list =  accountData2[1]
                   
                    no_rows = len(value_list)
                    no_columns= len(header_list)
            
                   
                    self.tableWidget_accInfo.setRowCount(no_rows) 
                    self.tableWidget_accInfo.setColumnCount(no_columns)
            
                    self.tableWidget_accInfo.setHorizontalHeaderLabels(tuple(header_list))
                    self.tableWidget_accInfo.setSelectionMode(QAbstractItemView.SingleSelection)
                    self.tableWidget_accInfo.setSelectionBehavior(QAbstractItemView.SelectRows)
                    self.tableWidget_accInfo.setSelectionMode(QAbstractItemView.ExtendedSelection)
                    self.tableWidget_accInfo.setEditTriggers(QAbstractItemView.NoEditTriggers)
                    
                
                    self.tableWidget_accInfo.setSortingEnabled(True)
                    self.tableWidget_accInfo.resizeRowsToContents()
                    self.tableWidget_accInfo.horizontalHeader().sortIndicatorChanged.connect(self.tableWidget_accInfo.resizeRowsToContents)
                    self.tableWidget_accInfo.setSelectionBehavior(QAbstractItemView.SelectRows) #full row  select
                    self.tableWidget_accInfo.setRowHeight(0, 10)
                    self.tableWidget_accInfo.resizeColumnsToContents()
            
                
                    for row in range(no_rows):
                        for col in range(no_columns):
                            self.tableWidget_accInfo.setItem(row,col,QTableWidgetItem(str(value_list[row][col])))
    
    数据处理程序.py

    from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
    from PyQt5.QtWidgets import QTableView, QApplication,QMessageBox, QLabel
    import sys
    
    USERNAME = '********'
    PASSWORD = '******'
    DATABASE = ''
    
    def selectedServer(server):
        switcher = {
            'Server 1': '1**.1*.7*.1*,1433',
            'Server 2': '1**.1*.7*.1*,1433',
        }
        return switcher.get(server, "Invalid Server ")
    
    def createConnection(self, server):
    
        SERVER = selectedServer(server)
        global db
        db = QSqlDatabase.addDatabase('QODBC')
        db.setDatabaseName(f'Driver={{SQL SERVER}}; Server={SERVER}; UID={USERNAME}; PWD={PASSWORD};')
        if db.open():
            print(f'{server} Server connected successfully')
            QMessageBox.about(self, 'Connection',f'{server} Server connected successfully')
            return True
        else:
            print(f'{server} connection failed')
            return False
    #loading data---------------
    def loadData(query_string):
      
        query = QSqlQuery(db)
        res = query.exec(query_string)
        record = query.record()
        column_number= record.count()
        
        header_list=[]
        for i in range(column_number):
            header_list.append(record.field(i).name())
        result_list = []
    
        while query.next():
            sublist =[]
            for i in range(column_number):
                sublist.append(query.value(i))
            result_list.append(sublist)
        
        return [header_list,result_list]
    
        from connection.connection import *
        from PyQt5 import QtCore, QtGui, QtWidgets
        from  PyQt5.QtWidgets import *
        
        def loadInsightAccount(input_value,type_value):
        
             if type_value=="AccountID":
                print("True")
                
                query_string="SELECT convert(int,iinsightaccountid) as AccountID,* from AccountMaster.dbo.Accounttable(nolock) where iinsightAccountID="+input_value
                print(query_string)
                InsightAcc_data=loadData(query_string)
        
                header_list = InsightAcc_data[0]
                value_list =  InsightAcc_data[1]
                # print(header_list)
                # print(value_list)
        
                return (InsightAcc_data)
    
    def insightAccountCall(self):
                    print("Loading insight Account datas...")    
                    
                    input_value=self.account_lineEdit.text()
                    type_value=str(self.account_comboBox.currentText())
                   
                    accountData2=loadInsightAccount(input_value,type_value)
            
                    header_list = accountData2[0]
                    value_list =  accountData2[1]
                   
                    no_rows = len(value_list)
                    no_columns= len(header_list)
            
                   
                    self.tableWidget_accInfo.setRowCount(no_rows) 
                    self.tableWidget_accInfo.setColumnCount(no_columns)
            
                    self.tableWidget_accInfo.setHorizontalHeaderLabels(tuple(header_list))
                    self.tableWidget_accInfo.setSelectionMode(QAbstractItemView.SingleSelection)
                    self.tableWidget_accInfo.setSelectionBehavior(QAbstractItemView.SelectRows)
                    self.tableWidget_accInfo.setSelectionMode(QAbstractItemView.ExtendedSelection)
                    self.tableWidget_accInfo.setEditTriggers(QAbstractItemView.NoEditTriggers)
                    
                
                    self.tableWidget_accInfo.setSortingEnabled(True)
                    self.tableWidget_accInfo.resizeRowsToContents()
                    self.tableWidget_accInfo.horizontalHeader().sortIndicatorChanged.connect(self.tableWidget_accInfo.resizeRowsToContents)
                    self.tableWidget_accInfo.setSelectionBehavior(QAbstractItemView.SelectRows) #full row  select
                    self.tableWidget_accInfo.setRowHeight(0, 10)
                    self.tableWidget_accInfo.resizeColumnsToContents()
            
                
                    for row in range(no_rows):
                        for col in range(no_columns):
                            self.tableWidget_accInfo.setItem(row,col,QTableWidgetItem(str(value_list[row][col])))
    
    mainApp.py

    from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
    from PyQt5.QtWidgets import QTableView, QApplication,QMessageBox, QLabel
    import sys
    
    USERNAME = '********'
    PASSWORD = '******'
    DATABASE = ''
    
    def selectedServer(server):
        switcher = {
            'Server 1': '1**.1*.7*.1*,1433',
            'Server 2': '1**.1*.7*.1*,1433',
        }
        return switcher.get(server, "Invalid Server ")
    
    def createConnection(self, server):
    
        SERVER = selectedServer(server)
        global db
        db = QSqlDatabase.addDatabase('QODBC')
        db.setDatabaseName(f'Driver={{SQL SERVER}}; Server={SERVER}; UID={USERNAME}; PWD={PASSWORD};')
        if db.open():
            print(f'{server} Server connected successfully')
            QMessageBox.about(self, 'Connection',f'{server} Server connected successfully')
            return True
        else:
            print(f'{server} connection failed')
            return False
    #loading data---------------
    def loadData(query_string):
      
        query = QSqlQuery(db)
        res = query.exec(query_string)
        record = query.record()
        column_number= record.count()
        
        header_list=[]
        for i in range(column_number):
            header_list.append(record.field(i).name())
        result_list = []
    
        while query.next():
            sublist =[]
            for i in range(column_number):
                sublist.append(query.value(i))
            result_list.append(sublist)
        
        return [header_list,result_list]
    
        from connection.connection import *
        from PyQt5 import QtCore, QtGui, QtWidgets
        from  PyQt5.QtWidgets import *
        
        def loadInsightAccount(input_value,type_value):
        
             if type_value=="AccountID":
                print("True")
                
                query_string="SELECT convert(int,iinsightaccountid) as AccountID,* from AccountMaster.dbo.Accounttable(nolock) where iinsightAccountID="+input_value
                print(query_string)
                InsightAcc_data=loadData(query_string)
        
                header_list = InsightAcc_data[0]
                value_list =  InsightAcc_data[1]
                # print(header_list)
                # print(value_list)
        
                return (InsightAcc_data)
    
    def insightAccountCall(self):
                    print("Loading insight Account datas...")    
                    
                    input_value=self.account_lineEdit.text()
                    type_value=str(self.account_comboBox.currentText())
                   
                    accountData2=loadInsightAccount(input_value,type_value)
            
                    header_list = accountData2[0]
                    value_list =  accountData2[1]
                   
                    no_rows = len(value_list)
                    no_columns= len(header_list)
            
                   
                    self.tableWidget_accInfo.setRowCount(no_rows) 
                    self.tableWidget_accInfo.setColumnCount(no_columns)
            
                    self.tableWidget_accInfo.setHorizontalHeaderLabels(tuple(header_list))
                    self.tableWidget_accInfo.setSelectionMode(QAbstractItemView.SingleSelection)
                    self.tableWidget_accInfo.setSelectionBehavior(QAbstractItemView.SelectRows)
                    self.tableWidget_accInfo.setSelectionMode(QAbstractItemView.ExtendedSelection)
                    self.tableWidget_accInfo.setEditTriggers(QAbstractItemView.NoEditTriggers)
                    
                
                    self.tableWidget_accInfo.setSortingEnabled(True)
                    self.tableWidget_accInfo.resizeRowsToContents()
                    self.tableWidget_accInfo.horizontalHeader().sortIndicatorChanged.connect(self.tableWidget_accInfo.resizeRowsToContents)
                    self.tableWidget_accInfo.setSelectionBehavior(QAbstractItemView.SelectRows) #full row  select
                    self.tableWidget_accInfo.setRowHeight(0, 10)
                    self.tableWidget_accInfo.resizeColumnsToContents()
            
                
                    for row in range(no_rows):
                        for col in range(no_columns):
                            self.tableWidget_accInfo.setItem(row,col,QTableWidgetItem(str(value_list[row][col])))
    

    QTableView一起使用。无论您如何使用for循环等在python中加载所有内容,速度总是会慢得多。非常感谢@ekhumoro,我现在能够使用QTableView的QsqlQueryModel加载数据。如何在我已在mainWindow.py中设计的“tableWidget”中显示您不能将
    QSqlQueryModel
    QTableWidget
    一起使用,因此必须将其替换为
    QTableView
    。QTableWidget类继承了
    QTableWidget
    类,因此基本相同,但没有一些方便的方法。谢谢@ekhumoro,请参见答案部分。我已经重新创建了.ui文件,并将QTableWidget更新为QTableView。现在我无法返回数据集。我知道,我做得不好。我是Pyqt5的新手。请帮帮我。如何返回数据集并在tableView中显示?在设置过程中在视图上设置一次模型,然后在模型上设置新查询以显示所选数据。不要继续重新创建模型和视图。只需执行self.tableView.model().setQuery(qry)
    。如果您想了解更多信息,请参阅Qt文档中的。