PyQt QSqlTableModel 的使用

创建数据模型

self.model = QtSql.QSqlTableModel(self)

self.model.setTable('user') 

self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)

self.model.select()

setTable() 是指定当前 model 关联的是哪张表。

setEditStrategy() 是设置修改模型。其参数是个枚举,共有3个值。

  1. OnFieldChange :模型的任何将立即更新到数据库。
  2. OnRowChange :当用户选择不同的行时,将应用对行(改动过的行)的更改。
  3. OnManualSubmit :所有更改将在模型中缓存,直到 submitAll() 或者 revertAll() 被调用。

select() 是从关联的表中获取数据,默认是获取全部数据。

关联 UI 展示

可以将 model 与控件关联,使用数据模型去刷新 UI 展示数据。下面是 QtTableView 关联的方法,其他的控件的关联方式也是类似的。

self.tableView.setModel(self.model)

将上文创建的 model 设置给 tableView 即可在 tableView 上展示表中数据。

显示的列名默认是数据库中表的列表,可以通过下方代码自定义列名。

self.model.setHeaderData(0, QtCore.Qt.Horizontal, 'ID')

使用 QSqlTableModel 会返回所有列,如果有列不希望展示出来,可以通过调用方法 tableView.setColumnHidden({columnIndex}, {isHidden}) 来隐藏列。

分页

QSqlTableModel 本身没有分页功能,但它也不会一次性把所有数据都加载出来,而是在用户下拉时动态加载更多,所以初始化时对程序整体的加载数据没有什么影响。

如果换确需要添加分布功能,可以通过在 setFilter() 的筛选条件里手动添加 limitoffset 来实现 分页逻辑:

self.model.setFilter('1=1 limit 10 offset 0')

需要注意的是,limitoffset 不能在筛选语句的最前面,如果是单纯的对整张表做分页,可以通过在前面加 1=1 来间接实现单一的分页逻辑。

排序

使用 setSort() 方法可以为展示的数据排序。使用方法为:

self.model.setSort(0, Qt.DescendingOrder)

第1个参数是指定排序基于的列,第2个参数是决定增序还是降序。Qt.AscendingOrder 是增序,Qt.DescendingOrder 是降序。

筛选查询

直接 select() 得到的是数据库里的所有数据,但很多时候在展示数据的时候需要做一些筛选,只展示期望的数据,此时需要使用 setFilter() 方法来筛选需要的数据。该方法传的参数即为筛选字符串,字符串的格式同 sql 查询时 where 关键字后的筛选条件格式。如:

self.model.setFilter('amount>9') self.model.select()

组合起来等价于查询语句:

select * from user where amount>9;

增删改

self.model.insertRow(row)

row 是行想要添加的位置,类型是 int

self.model.removeRow(row)

row 是 tableView 中想要删除的行的位置,类型是 int

可以直接在 QtTableView 中进行修改。也可以通过代码修改数据,修改的方式如下:

self.model.setData(self.model.index(row, 0), newId);

需要注意的是,此处第1个参数不再是 int 型的位置,而是 QModelIndex 型的1个对象。

如果 editStrategyOnManualSubmit ,增、删、改查之后需要手动调用 submitAll() 时才会把修改写入数据库。

如果要取消当前修改,可以通过 revertAll() 来实现。

自定义查询

如果期望展示的数据涉及的内容不止1张表,此时 setTable() 已经不能满足需求,应改为使用 setQuery() 来自定义查询涉及的表及返回结果。

query = QtSql.QSqlQuery("SELECT t.id, t.`name`, u.`name`, t.`create_time`, t.`update_time` FROM status t LEFT JOIN user u ON t.user_id=u.id) 

self.model.setQuery(query) 

self.model.query()

QSqlQuery 里的语句格式同普通的 Sql 的查询语句格式。

获取结果时也不能使用 select() ,而是需要使用 query()

在使用 query() 来获取数据时,setSort()setFilter() 已经无效了,需要自行在 query 语句中添加相应逻辑。

作者:originalMemory
链接:https://juejin.cn/post/6856413054461018119
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(pyqt)