- 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 –
QObjectdb –
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()