概述
我的代码“工作”不好,因为每次点击我的组合框时,模型都会检查数据库数千次,这使得它非常迟钝.
这样做的“规范方法”是什么?
我在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_())
通过填充__init __()中的用户列表,我们缓存数据库结果并避免频繁查询.这只会带你到目前为止,因为在修改数据库的内容时你还必须更新这个缓存.因此,当您添加或删除用户时,还需要调用UserListModel.refresh().
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys import sqlalchemy from sqlalchemy.ext.declarative import declarative_base from PyQt4 import QtCore,self.name) # Creating my base and my session engine = sqlalchemy.create_engine("sqlite:///my_db.db",echo='debug') base.Metadata.create_all(engine) DBsession = sqlalchemy.orm.sessionmaker(bind=engine) session = DBsession() # My model,parent) self.session = session self.refresh() def refresh(self): self.users = self.session.query(User).all() def rowCount(self,parent): return len(self.users) def data(self,role): if role == QtCore.Qt.DisplayRole: value = self.users[index.row()] return "%s : %s" % (value.id_,tmp_name): session.add(User(name=tmp_name)) session.commit() # Populating my db if not session.query(User).count(): 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应用程序全部内容,希望文章能够帮你解决python – 使用sqlalchemy数据库的PyQt应用程序所遇到的程序开发问题。
如果您也喜欢它,动动您的小指点个赞吧