警告
本节包含从 C++ 自动翻译到 Python 的代码片段,可能包含错误。
执行 SQL 语句#
下一个部分中描述的 QSqlQuery
类提供了一个执行 SQL 语句并在查询结果集中导航的接口。
下一个部分中描述的 QSqlQueryModel
和 QSqlTableModel
类提供了一个更高级别访问数据库的接口。如果您不熟悉 SQL,您可能想直接跳到下一节(使用 SQL 模型类)。
执行查询#
要执行 SQL 语句,只需创建一个 QSqlQuery
对象,并像这样调用 exec()
query = QSqlQuery() query.exec("SELECT name, salary FROM employee WHERE salary > 50000")
QSqlQuery
构造函数接受一个可选的 QSqlDatabase
对象,指定要使用哪个数据库连接。在上面的示例中,我们没有指定任何连接,因此使用默认连接。
如果发生错误,则 exec()
返回 false
。错误将作为 lastError()
可用。
插入、更新和删除记录链接到本节
QSqlQuery
可以执行任意SQL语句,而不仅仅是SELECT
语句。以下示例使用INSERT
将记录插入到表中。
query = QSqlQuery() query.exec("INSERT INTO employee (id, name, salary) " "VALUES (1001, 'Thad Beaumont', 65000)")
如果您想同时插入众多记录,将查询与实际插入值分离通常更有效。这可以通过使用占位符完成。Qt支持两种占位符语法:命名绑定和位置绑定。以下是一个命名绑定的示例
query = QSqlQuery() query.prepare("INSERT INTO employee (id, name, salary) " "VALUES (:id, :name, :salary)") query.bindValue(":id", 1001) query.bindValue(":name", "Thad Beaumont") query.bindValue(":salary", 65000) query.exec()
以下是一个位置绑定的示例
query = QSqlQuery() query.prepare("INSERT INTO employee (id, name, salary) " "VALUES (?, ?, ?)") query.addBindValue(1001) query.addBindValue("Thad Beaumont") query.addBindValue(65000) query.exec()
这两种语法都适用于Qt提供的所有数据库驱动程序。如果数据库支持原生语法,Qt将简单地forward查询到数据库管理系统;否则,Qt通过预处理查询来模拟占位符语法。最终由数据库管理系统执行的查询可用作executedQuery()
。
插入多个记录时,您只需调用一次prepare()
。然后您可以调用bindValue()
或addBindValue()
,然后按照需要多次调用exec()
。
除了性能之外,占位符的一个优点是可以轻松指定任意值而无需担心转义特殊字符。
更新记录类似于将其插入到表中
query = QSqlQuery() query.exec("UPDATE employee SET salary = 70000 WHERE id = 1003")
您也可以使用命名或位置绑定将参数关联到实际值。
最后,这里是一个DELETE
语句的示例
query = QSqlQuery() query.exec("DELETE FROM employee WHERE id = 1007")
事务链接到本节
如果底层数据库引擎支持事务,则 hasFeature
( Transactions
) 将返回 true。您可以使用 transaction()
方法启动事务,然后在该事务的上下文中执行您想执行的 SQL 命令,最后执行 commit()
或 rollback()
。在事务处理时,您必须先启动事务再创建查询。
示例
QSqlDatabase.database().transaction() query = QSqlQuery() query.exec("SELECT id FROM employee WHERE name = 'Torild Halvorsen'") if query.next(): employeeId = query.value(0).toInt() query.exec("INSERT INTO project (id, name, ownerid) " "VALUES (201, 'Manhattan Project', " + QString.number(employeeId) + ')') QSqlDatabase.database().commit()
事务可以用以确保复杂操作是原子的(例如,查询外键和创建记录),或者提供一个在复杂更改过程中取消的方法。