class QSqlTableModel#

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

Inheritance diagram of PySide6.QtSql.QSqlTableModel

继承自: QSqlRelationalTableModel

摘要#

方法#

虚方法#

槽(a class="headerlink" href="#slots" title="链接到本标题">#

信号(a class="headerlink" href="#signals" title="链接到本标题">#

注意

本文档可能包含从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表名和编辑策略,然后设置在视图标题中显示的标签。编辑策略决定了用户在视图中进行更改时,何时将这些更改实际应用到数据库中。可能的值有OnFieldChangeOnRowChange ,和 OnManualSubmit

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

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

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

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

tablemodel示例说明了如何将QSqlTableModel用作QTableView的数据源。

QSqlTableModel 不直接支持外键。如果需要处理外键,请使用 QSqlRelationalTableModelQSqlRelationalDelegate

class EditStrategy#

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

常量

描述

QSqlTableModel.OnFieldChange

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

QSqlTableModel.OnRowChange

在用户选择不同的行时,将应用行的更改。

QSqlTableModel.OnManualSubmit

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

注意:为了防止将只部分初始化的行插入到数据库中,对于新插入的行,OnFieldChange 将表现出类似于 OnRowChange 的行为。

另请参阅

setEditStrategy()

__init__([parent=None[, db=QSqlDatabase()]])#
参数:

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

默认编辑策略是 OnRowChange

beforeDelete(row)#
参数:

row – int

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

beforeInsert(record)#
参数:

recordQSqlRecord

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

beforeUpdate(row, record)#
参数:

此信号在将rowrecord中的值更新到当前活动数据库表之前由updateRowInTable()发出。

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

另请参阅

isGenerated()

database()#
返回类型:

QSqlDatabase

返回模型数据库连接。

deleteRowFromTable(row)#
参数:

row – int

返回类型:

bool

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

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

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

另请参阅

removeRows()

editStrategy()#
返回类型:

编辑策略

返回当前编辑策略。

另请参阅

setEditStrategy()

fieldIndex(fieldName)#
参数:

fieldName – 字符串

返回类型:

整数

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

filter()#
返回类型:

字符串

返回当前设置的过滤器。

另请参阅

setFilter() select()

insertRecord(row, record)
参数:
返回类型:

bool

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

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

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

另请参阅

insertRows() removeRows() setRecord()

insertRowIntoTable(values)#
参数:

valuesQSqlRecord

返回类型:

bool

values 插入当前活动数据库表中。

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

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

另请参阅

lastError() insertRows()

isDirty()#
返回类型:

bool

这是一个重载函数。

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

isDirty(index)
参数:

indexQModelIndex

返回类型:

bool

如果index位置的值已更改但尚未写入数据库,则返回true。否则返回false。

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

orderByClause()#
返回类型:

字符串

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

primaryKey()#
返回类型:

QSqlIndex

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

primaryValues(row)#
参数:

row – int

返回类型:

QSqlRecord

返回一个记录,包含在主键集中以row中设置的值的字段。如果没有定义主键,返回的记录将包含所有字段。

另请参阅

primaryKey()

primeInsert(row, record)#
参数:

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

revertAll()#

撤销所有待处理更改。

另请参阅

revert() revertRow() submitAll()

revertRow(row)#
参数:

row – int

撤销指定row的所有更改。

另请参阅

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

select()#
返回类型:

bool

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

注意

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

selectRow(row)#
参数:

row – int

返回类型:

bool

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

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

另请参阅

select()

selectStatement()#
返回类型:

字符串

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

另请参阅

filter() orderByClause()

setEditStrategy(strategy)#
参数:

strategyEditStrategy

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

这将撤销任何挂起的更改。

setFilter(filter)#
参数:

filter – str

将当前过滤器设置为 filter

该过滤器是一个不带关键字 WHERE 的 SQL WHERE 子句(例如,name='Josephine')

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

setPrimaryKey(key)#
参数:

keyQSqlIndex

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

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

另请参阅

primaryKey() primaryIndex()

setRecord(row, record)
参数:
返回类型:

bool

values的值应用到模型中的row上。源字段和目标字段是根据字段名来映射的,而不是根据记录中的位置。

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

对于编辑策略OnFieldChangeOnRowChange,只有在其他行没有缓存的更改时,行才能接收更改。更改将立即提交。提交的更改在失败时不会被撤销。

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

另请参阅

record() editStrategy()

setSort(column, order)
参数:

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

另请参阅

sort() select() orderByClause()

setTable(tableName)#
参数:

tableName – 字符串

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

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

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

另请参阅

select() setFilter() lastError()

submitAll()#
返回类型:

bool

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

OnManualSubmit 模式下,成功后模型将被填充。表示它的任何视图都将丢失其选择。

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

另请参阅

revertAll() lastError()

tableName()#
返回类型:

字符串

返回当前选定表的名称。

updateRowInTable(row, values)#
参数:
返回类型:

bool

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

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

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

另请参阅

isGenerated() setData()