PySide6.QtSql.QSqlTableModel

class QSqlTableModel

QSqlTableModel 类为单个数据库表提供了一个可编辑的数据模型。更多

PySide6.QtSql.QSqlTableModel 的继承图

继承者: QSqlRelationalTableModel

概要

方法

虚拟方法

插槽

信号

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

QSqlTableModel 是一个用于从单个表中读取和写入数据库记录的高级接口。它建立在较低级别的 QSqlQuery 之上,并可用于向视图类(如 QTableView)提供数据。例如:

model = QSqlTableModel()
model.setTable("employee")
model.setEditStrategy(QSqlTableModel.OnManualSubmit)
model.select()
model.setHeaderData(0, Qt.Horizontal, tr("Name"))
model.setHeaderData(1, Qt.Horizontal, tr("Salary"))
view = QTableView()
view.setModel(model)
view.hideColumn(0) # don't show the ID
view.show()

我们设置了SQL表的名称和编辑策略,然后设置了视图中显示的标签。编辑策略决定了用户在视图中所做的更改何时实际应用到数据库中。可能的值为OnFieldChangeOnRowChangeOnManualSubmit

QSqlTableModel 也可以用于以编程方式访问数据库,而不需要将其绑定到视图:

model = QSqlTableModel()
model.setTable("employee")
model.select()
salary = model.record(4).value("salary").toInt()

上面的代码片段从查询SELECT * from employee的结果集中提取了记录4的salary字段。

可以使用setFilter()设置过滤器,或使用setSort()修改排序顺序。最后,必须调用select()以用数据填充模型。

tablemodel 示例展示了如何使用 QSqlTableModel 作为 QTableView 的数据源。

QSqlTableModel 不直接支持外键。如果你想解析外键,请使用 QSqlRelationalTableModelQSqlRelationalDelegate

另请参阅

QSqlRelationalTableModel QSqlQuery 表格模型示例 缓存的SQL表格

class EditStrategy

此枚举类型描述了在编辑数据库中的值时应选择哪种策略。

常量

描述

QSqlTableModel.OnFieldChange

对模型的所有更改将立即应用到数据库。

QSqlTableModel.OnRowChange

当用户选择不同的行时,对行的更改将被应用。

QSqlTableModel.OnManualSubmit

所有更改将缓存在模型中,直到调用submitAll()revertAll()

注意:为了防止将仅部分初始化的行插入数据库,OnFieldChange 对于新插入的行将表现得像 OnRowChange

另请参阅

setEditStrategy()

__init__([parent=None[, db=QSqlDatabase()]])
Parameters:

创建一个空的QSqlTableModel,并将父对象设置为parent,数据库连接设置为db。如果db无效,将使用默认的数据库连接。

默认的编辑策略是OnRowChange

beforeDelete(row)
Parameters:

– 整数

此信号由deleteRowFromTable()row从当前活动的数据库表中删除之前发出。

beforeInsert(record)
Parameters:

记录QSqlRecord

此信号由insertRowIntoTable()在将新行插入当前活动数据库表之前发出。即将插入的值存储在record中,并且可以在插入之前进行修改。

beforeUpdate(row, record)
Parameters:

此信号由updateRowInTable()row使用record中的值更新当前活动数据库表之前发出。

请注意,只有标记为生成的值才会被更新。生成标志可以通过setGenerated()设置,并通过isGenerated()检查。

另请参阅

isGenerated()

database()
Return type:

QSqlDatabase

返回模型的数据库连接。

deleteRowFromTable(row)
Parameters:

– 整数

Return type:

布尔

从当前活动的数据库表中删除给定的 row

这是一个直接在数据库上操作的低级方法,不应直接调用。使用removeRow()或removeRows()来删除值。模型将根据其编辑策略决定何时修改数据库。

如果行被删除,则返回 true;否则返回 false

另请参阅

removeRows()

editStrategy()
Return type:

EditStrategy

返回当前的编辑策略。

另请参阅

setEditStrategy()

fieldIndex(fieldName)
Parameters:

fieldName – str

Return type:

整数

返回字段 fieldName 的索引,如果模型中不存在相应的字段,则返回 -1。

filter()
Return type:

字符串

返回当前设置的过滤器。

另请参阅

setFilter() select()

insertRecord(row, record)
Parameters:
Return type:

布尔

在位置 row 插入 record。如果 row 为负数,记录将被追加到末尾。内部调用 insertRows()setRecord()

如果记录可以插入,则返回 true,否则返回 false。

更改会立即提交给OnFieldChangeOnRowChange。失败不会在模型中留下新行。

另请参阅

insertRows() removeRows() setRecord()

insertRowIntoTable(values)
Parameters:

QSqlRecord

Return type:

布尔

将值 values 插入到当前活动的数据库表中。

这是一个直接在数据库上操作的低级方法,不应直接调用。使用insertRow()和setData()来插入值。模型将根据其编辑策略决定何时修改数据库。

如果值可以插入,则返回 true,否则返回 false。错误信息可以通过 lastError() 获取。

另请参阅

lastError() insertRows()

isDirty()
Return type:

布尔

这是一个重载函数。

如果模型包含尚未提交到数据库的修改值,则返回 true,否则返回 false。

isDirty(index)
Parameters:

索引QModelIndex

Return type:

布尔

如果索引 index 处的值是脏的,则返回 true,否则返回 false。脏值是指在模型中修改但尚未写入数据库的值。

如果 index 无效或指向不存在的行,则返回 false。

orderByClause()
Return type:

字符串

返回基于当前设置的排序顺序的SQL ORDER BY子句。

primaryKey()
Return type:

QSqlIndex

返回当前表的主键,如果表未设置或没有主键,则返回一个空的QSqlIndex

primaryValues(row)
Parameters:

– 整数

Return type:

QSqlRecord

返回一个记录,该记录包含主键中表示的字段,这些字段设置为row处的值。如果未定义主键,则返回的记录将包含所有字段。

另请参阅

primaryKey()

primeInsert(row, record)
Parameters:

当在当前活动数据库表的给定row中启动插入时,此信号由insertRows()发出。record参数可以被写入(因为它是一个引用),例如用默认值填充某些字段并设置字段的生成标志。在处理此信号时,不要尝试通过其他方式(如setData()setRecord())编辑记录。

revertAll()

撤销所有待处理的更改。

另请参阅

revert() revertRow() submitAll()

revertRow(row)
Parameters:

– 整数

恢复指定row的所有更改。

另请参阅

revert() revertAll() submit() submitAll()

select()
Return type:

布尔

使用指定的过滤和排序条件,从通过setTable()设置的表中填充数据到模型中,如果成功则返回true;否则返回false

注意

调用select()将撤销任何未提交的更改并移除任何插入的列。

selectRow(row)
Parameters:

– 整数

Return type:

布尔

使用数据库表中与主键值匹配的行中的值刷新模型中的row。如果没有主键,所有列值必须匹配。如果未找到匹配的行,模型将显示一个空行。

如果成功,返回 true;否则返回 false

另请参阅

select()

selectStatement()
Return type:

字符串

返回用于内部填充模型的SQL SELECT语句。该语句包括过滤器和ORDER BY子句。

另请参阅

filter() orderByClause()

setEditStrategy(strategy)
Parameters:

策略EditStrategy

设置数据库中的值编辑策略为strategy

这将撤销任何待定的更改。

setFilter(filter)
Parameters:

filter – 字符串

将当前过滤器设置为 filter

过滤器是一个SQL WHERE 子句,但不包含关键字 WHERE(例如,name='Josephine')

如果模型已经填充了来自数据库的数据,模型将使用新的过滤器重新选择它。否则,过滤器将在下次调用select()时应用。

setPrimaryKey(key)
Parameters:

keyQSqlIndex

受保护的方法,允许子类将主键设置为key

通常情况下,每当您调用setTable()时,主索引会自动设置。

setRecord(row, record)
Parameters:
Return type:

布尔

values应用于模型中的row。源字段和目标字段通过字段名称映射,而不是通过记录中的位置。

请注意,values 中生成的标志会被保留,以确定在将更改提交到数据库时是否使用了相应的字段。默认情况下,QSqlRecord 中的所有字段都设置为 true。您必须使用 setGenerated (false) 将 values 中的任何值的标志设置为 false,以便将更改保存回数据库。

对于编辑策略 OnFieldChangeOnRowChange,只有在没有其他行有缓存更改的情况下,一行才能接收更改。更改会立即提交。提交的更改在失败时不会回滚。

如果所有值都可以设置,则返回 true;否则返回 false。

另请参阅

record() editStrategy()

setSort(column, order)
Parameters:

column的排序顺序设置为order。这不会影响当前数据,要使用新的排序顺序刷新数据,请调用select()

另请参阅

sort() select() orderByClause()

setTable(tableName)
Parameters:

tableName – str

设置模型操作的数据库表为tableName。不会从表中选择数据,而是获取其字段信息。

要用表格的数据填充模型,请调用 select()

错误信息可以通过lastError() 获取。

submitAll()
Return type:

布尔

提交所有挂起的更改并在成功时返回true。在错误时返回false,可以通过lastError()获取详细的错误信息。

OnManualSubmit中,成功时模型将被重新填充。任何展示它的视图将失去它们的选择。

注意:在OnManualSubmit模式下,当submitAll()失败时,已提交的更改不会从缓存中清除。这允许事务回滚并重新提交而不会丢失数据。

另请参阅

revertAll() lastError()

tableName()
Return type:

字符串

返回当前选择的表的名称。

updateRowInTable(row, values)
Parameters:
Return type:

布尔

使用指定的values更新当前活动数据库表中的给定row。如果成功,返回true;否则返回false

这是一个直接在数据库上操作的低级方法,不应直接调用。使用setData()来更新值。模型将根据其编辑策略决定何时修改数据库。

请注意,只有设置了生成标志的值才会被更新。生成标志可以通过setGenerated()设置,并通过isGenerated()进行测试。

另请参阅

isGenerated() setData()