从SQLAlchemy填充QTableView 程序步骤

我正在尝试使用PyQt5和SQLAlchemy作为orm创建一些小型GUI应用程序,但是,我似乎找不到从SQLAlchemy查询填充QTableView的方法。

我的目标是使用SQLAlchemy检索数据,然后在QTableView中显示查询结果。

我可以使用以下代码获取数据:

def fetch_data():
    metadata = db.schema.MetaData(bind=engine,reflect=True)
    table = db.Table('tbl_inv',metadata,autoload=True)

    query = db.select([
         table.columns.code,table.columns.decription,table.columns.uom,])

    result = conn.execute(query)
    result_set = result.fetchall()

    return result_set

我正在尝试执行此操作,但没有成功。 Fastest way to populate QTableView from Pandas data frame

我想我必须将数据放入数据框,然后使用上述链接解决方案,但是我确信这在操作方面会很昂贵。

wsydy2006 回答:从SQLAlchemy填充QTableView 程序步骤

程序步骤

  1. 设置环境
sudo apt install python3-pip
sudo pip3 install pyqt5
sudo pip3 install sqlalchemy
  1. 运行demo.py(它将在本地将测试数据插入sqlite)
from PyQt5.QtWidgets import QApplication,QWidget,QTableView,QAbstractItemView,QVBoxLayout
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5 import QtGui,QtCore
import sqlalchemy as db
import os

# 1. rm demo.db
os.remove("demo.db")

engine = db.create_engine('sqlite:///demo.db?check_same_thread=False',echo=True)
# 2. Creates demo table
connection = engine.connect()
metadata = db.MetaData()
demoTable = db.Table('demo',metadata,db.Column('code',db.String(255),nullable=False),db.Column('decription',db.Column('uom',nullable=False)
            )

metadata.create_all(engine) 

# 3. Creates demo data
query = db.insert(demoTable) 
values_list = [
    {'code':'058176','decription':'01','uom':'rb1705,rb1710'},{'code':'058176','decription':'02','uom':'cu1705,cu1710'},'decription':'03','uom':'zn1705,zn1710'},'decription':'04','uom':'ru1705,ru1710'},'uom':'ni1705,ni1710'},]
ResultProxy = connection.execute(query,values_list)

class DemoWindow(QWidget):
    def __init__(self,header,*args):
        QWidget.__init__(self,*args)
        self.setWindowTitle("Demo QTableView")

        self.table_model = DemoTableModel(self,header)
        self.table_view = QTableView()
        self.table_view.setModel(self.table_model)
        layout = QVBoxLayout(self)
        layout.addWidget(self.table_view)
        self.setLayout(layout)

class DemoTableModel(QAbstractTableModel):

    def __init__(self,parent,*args):
        QAbstractTableModel.__init__(self,*args)
        # 5. fetch data
        results = connection.execute(db.select([demoTable])).fetchall()
        self.mylist = results
        self.header = header

    def rowCount(self,parent):
        return len(self.mylist)

    def columnCount(self,parent):
        return len(self.mylist[0])

    def data(self,index,role):
        # 5. populate data
        if not index.isValid():
            return None
        if (role == Qt.DisplayRole):
            return self.mylist[index.row()][index.column()]
        else:
            return QVariant()

    def headerData(self,col,orientation,role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.header[col]
        return None

if __name__ == '__main__':
    app = QApplication([])
    header = ['code','decription','uom']
    win = DemoWindow(header)
    win.show()
    app.exec_()
本文链接:https://www.f2er.com/3154081.html

大家都在问