- class QSqlTableModel#
QSqlTableModel
类提供了一个单个数据库表的可编辑数据模型。更多…摘要#
方法#
def
__init__()
def
database()
def
editStrategy()
def
fieldIndex()
def
filter()
def
insertRecord()
定义
isDirty()
定义
primaryKey()
定义
setRecord()
定义
tableName()
虚方法#
定义
revertRow()
定义
select()
定义
selectRow()
定义
setFilter()
定义
setSort()
定义
setTable()
槽(a class="headerlink" href="#slots" title="链接到本标题">#
定义
revertAll()
定义
submitAll()
信号(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表名和编辑策略,然后设置在视图标题中显示的标签。编辑策略决定了用户在视图中进行更改时,何时将这些更改实际应用到数据库中。可能的值有
OnFieldChange
,OnRowChange
,和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
不直接支持外键。如果需要处理外键,请使用QSqlRelationalTableModel
和QSqlRelationalDelegate
。- class EditStrategy#
该枚举类型描述了在数据库中编辑值时选择哪种策略。
常量
描述
QSqlTableModel.OnFieldChange
模型的所有更改将立即应用于数据库。
QSqlTableModel.OnRowChange
在用户选择不同的行时,将应用行的更改。
QSqlTableModel.OnManualSubmit
所有更改都将缓存在模型中,直到调用
submitAll()
或revertAll()
。注意:为了防止将只部分初始化的行插入到数据库中,对于新插入的行,
OnFieldChange
将表现出类似于OnRowChange
的行为。另请参阅
- __init__([parent=None[, db=QSqlDatabase()]])#
- 参数:
parent –
QObject
db –
QSqlDatabase
创建一个空的
QSqlTableModel
并将父类设置为parent
和数据库连接设置为db
。如果db
无效,将使用默认数据库连接。默认编辑策略是
OnRowChange
。- beforeDelete(row)#
- 参数:
row – int
此信号在从当前活动数据库表中删除行之前由
deleteRowFromTable()
发出。- beforeInsert(record)#
- 参数:
record –
QSqlRecord
此信号在将新行插入当前活动数据库表之前由
insertRowIntoTable()
发出。即将插入的值存储在record
中,并在实际插入之前可以被修改。- beforeUpdate(row, record)#
- 参数:
row – int
record –
QSqlRecord
此信号在将
row
用record
中的值更新到当前活动数据库表之前由updateRowInTable()
发出。请注意,仅标记为生成的值将被更新。可以通过
setGenerated()
设置生成的标志,并通过isGenerated()
检查。另请参阅
- database()#
- 返回类型:
返回模型数据库连接。
- deleteRowFromTable(row)#
- 参数:
row – int
- 返回类型:
bool
从当前活动数据库表中删除指定的
row
。这是一个低级方法,直接在数据库上操作,不应直接调用。使用removeRow()或
removeRows()
来删除值。模型将根据其编辑策略决定何时修改数据库。如果行被删除则返回
true
,否则返回false
。另请参阅
removeRows()
返回当前编辑策略。
另请参阅
- fieldIndex(fieldName)#
- 参数:
fieldName – 字符串
- 返回类型:
整数
返回字段
fieldName
的索引,如果模型中不存在对应字段,则返回 -1。- filter()#
- 返回类型:
字符串
返回当前设置的过滤器。
另请参阅
-
insertRecord(row, record)
- 参数:
row – int
record –
QSqlRecord
- 返回类型:
bool
将 record
插入到位置 row
。如果 row
为负数,则将记录追加到末尾。内部调用 insertRows()
和 setRecord()
。
如果记录可以插入,则返回 true
,否则返回 false。
对于 OnFieldChange
和 OnRowChange
,更改将立即提交。失败不会在模型中留下新行。
另请参阅
insertRows()
removeRows()
setRecord()
- insertRowIntoTable(values)#
- 参数:
values –
QSqlRecord
- 返回类型:
bool
将 values
插入当前活动数据库表中。
这是一个低级方法,它直接操作数据库,不应直接调用。使用 insertRow() 和 setData()
插入值。模型将根据其编辑策略来决定何时修改数据库。
如果值可以插入,则返回 true
,否则返回 false。错误信息可以通过 lastError()
获取。
另请参阅
lastError()
insertRows()
- isDirty()#
- 返回类型:
bool
这是一个重载函数。
如果模型包含尚未提交到数据库的修改值,则返回true
,否则返回false。
- isDirty(index)
- 参数:
index –
QModelIndex
- 返回类型:
bool
如果index
位置的值已更改但尚未写入数据库,则返回true
。否则返回false。
如果index
无效或指向一个不存在的行,则返回false。
- orderByClause()#
- 返回类型:
字符串
返回一个基于当前设置排序顺序的SQL ORDER BY
子句。
返回当前表格的主键,如果没有设置表格或没有主键,则返回一个空的QSqlIndex
。
- primaryValues(row)#
- 参数:
row – int
- 返回类型:
返回一个记录,包含在主键集中以row
中设置的值的字段。如果没有定义主键,返回的记录将包含所有字段。
另请参阅
- primeInsert(row, record)#
- 参数:
row – int
record –
QSqlRecord
该信号由insertRows()
发出,当在当前活动的数据库表中给定row
处初始化插入时。由于它是一个引用,record
参数可被写入,例如用默认值填充一些字段并设置字段的生成标志。处理此信号时,不要尝试通过其他方式如setData()
或setRecord()
编辑记录。
- revertAll()#
撤销所有待处理更改。
另请参阅
revert()
revertRow()
submitAll()
- revertRow(row)#
- 参数:
row – int
撤销指定row
的所有更改。
另请参阅
revert()
revertAll()
submit()
submitAll()
- select()#
- 返回类型:
bool
使用指定的筛选条件和排序条件,通过setTable()
设置的表数据填充模型,如果成功则返回true
;否则返回false
。
- selectRow(row)#
- 参数:
row – int
- 返回类型:
bool
使用匹配主键值的数据库表行中的值刷新模型中的row
。如果没有主键,所有列值必须匹配。如果未找到匹配的行,模型将显示一个空行。
如果成功则返回true
;否则返回false
。
另请参阅
- selectStatement()#
- 返回类型:
字符串
返回用于填充模型的内部 SELECT
语句。该语句包括过滤器和 ORDER BY
子句。
另请参阅
- setEditStrategy(strategy)#
- 参数:
strategy –
EditStrategy
将编辑数据库中值的策略设置为 strategy
。
这将撤销任何挂起的更改。
- setFilter(filter)#
- 参数:
filter – str
将当前过滤器设置为 filter
。
该过滤器是一个不带关键字 WHERE
的 SQL WHERE
子句(例如,name='Josephine')
。
如果模型已用来自数据库的数据填充,则模型将使用新过滤器重新选择它。否则,在下次调用 select()
时应用过滤器。
受保护方法,允许子类将主键设置为 key
。
通常情况下,在调用setTable()
时,主索引会自动设置。
另请参阅
primaryKey()
primaryIndex()
- setRecord(row, record)
- 参数:
row – int
record –
QSqlRecord
- 返回类型:
bool
将values
的值应用到模型中的row
上。源字段和目标字段是根据字段名来映射的,而不是根据记录中的位置。
注意,在values
中生成的标志被保留,以确定在将更改提交到数据库时是否使用了相应的字段。默认情况下,对于QSqlRecord
中的所有字段,它设置为true
。您必须使用setGenerated
(false)将标志设置为false
,以将更改保存回数据库。
对于编辑策略OnFieldChange
和OnRowChange
,只有在其他行没有缓存的更改时,行才能接收更改。更改将立即提交。提交的更改在失败时不会被撤销。
如果所有值都可以设置,则返回true
;否则返回false。
另请参阅
record()
editStrategy()
- setSort(column, order)
- 参数:
列 - int
排序顺序 -
SortOrder
将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)#
- 参数:
row – int
values –
QSqlRecord
- 返回类型:
bool
使用指定的values
更新当前活动数据库表中的给定row
。如果成功则返回true
;否则返回false
。
这是一个低级方法,它直接在数据库上操作,不应直接调用。请使用 setData()
来更新值。模型将根据其编辑策略判断何时修改数据库。
请注意,只有设置了生成标志的值才会被更新。可以通过 setGenerated()
设置生成标志,并通过 isGenerated()
测试。
另请参阅
isGenerated()
setData()