您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 使用sqlalchemy数据库的PyQt应用程序

5b51 2022/1/14 8:22:51 python 字数 8040 阅读 575 来源 www.jb51.cc/python

我试图创建一个PyQt应用程序,并将数据存储到数据库中.我想使用sqlachemy来访问我的数据并使用PyQt中的模型显示数据. 在这个例子中,我用一个组合框来显示我的数据. 我的代码“工作”不好,因为每次点击我的组合框时,模型都会检查数据库数千次,这使得它非常迟钝. 这样做的“规范方法”是什么? 我在Windows下使用Python 3.4和PyQt 4.我在Python-Sqlalchemy-

概述

在这个例子中,我用一个组合框来显示我的数据.

我的代码“工作”不好,因为每次点击我的组合框时,模型都会检查数据库数千次,这使得它非常迟钝.

这样做的“规范方法”是什么?

我在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应用程序所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶