创建数据模型
self.model = QtSql.QSqlTableModel(self)
self.model.setTable('user')
self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
self.model.select()
setTable()
是指定当前 model
关联的是哪张表。
setEditStrategy()
是设置修改模型。其参数是个枚举,共有3个值。
OnFieldChange
:模型的任何将立即更新到数据库。OnRowChange
:当用户选择不同的行时,将应用对行(改动过的行)的更改。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()
的筛选条件里手动添加 limit
和 offset
来实现 分页逻辑:
self.model.setFilter('1=1 limit 10 offset 0')
需要注意的是,limit
和 offset
不能在筛选语句的最前面,如果是单纯的对整张表做分页,可以通过在前面加 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个对象。
如果
editStrategy
是OnManualSubmit
,增、删、改查之后需要手动调用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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。