【发布时间】:2016-01-28 08:05:07
【问题描述】:
我尝试创建一个 PyQt 应用程序,并将数据存储到数据库中。我想使用 sqlachemy 访问我的数据并在 PyQt 中使用模型显示数据。
在这个例子中,我使用了一个组合框来显示我的数据。
我的代码“工作”很糟糕,因为每次我点击我的组合框时,模型都会检查数据库数千次,使其非常滞后。
执行此操作的“规范方法”是什么?
我在 Windows 下使用 Python 3.4 和 PyQt 4。我的 Python-Sqlalchemy-PyQt-english 水平很低。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from PyQt4 import QtCore, QtGui, uic
# My base structure
base = declarative_base()
class User(base):
__tablename__ = "users"
id_ = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
name = sqlalchemy.Column(sqlalchemy.String(20))
def __repr__(self):
return "<User(id='%s', name='%s')>" % (self.id_, self.name)
# Creating my base and my session
engine = sqlalchemy.create_engine("sqlite:///my_db.db")
base.metadata.create_all(engine)
DBsession = sqlalchemy.orm.sessionmaker(bind=engine)
session = DBsession()
# My model, i just want to show data
class UserListModel(QtCore.QAbstractListModel):
def __init__(self, session, parent = None):
QtCore.QAbstractListModel.__init__(self, parent)
self.session = session
def rowCount(self, parent):
return len(get_users(self.session))
def data(self, index, role):
users = get_users(self.session)
# Only for debug
print(users)
if role == QtCore.Qt.DisplayRole:
value = users[index.row()]
return "%s : %s" % (value.id_, value.name)
def add_user(session, tmp_name):
session.add(User(name=tmp_name))
session.commit()
def get_users(session):
users = session.query(User).all()
return users
# Populating my db
session.add(User(name="edouard"))
session.add(User(name="jean"))
session.add(User(name="albert"))
session.commit()
# Creating my app
app = QtGui.QApplication(sys.argv)
mywindow = QtGui.QWidget()
# Combobox and his model
combobox = QtGui.QComboBox(mywindow)
combobox.setModel(UserListModel(session))
mywindow.show()
sys.exit(app.exec_())
【问题讨论】:
标签: python sqlalchemy pyqt pyqt4