警告

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

执行 SQL 语句#

下一个部分中描述的 QSqlQuery 类提供了一个执行 SQL 语句并在查询结果集中导航的接口。

下一个部分中描述的 QSqlQueryModelQSqlTableModel 类提供了一个更高级别访问数据库的接口。如果您不熟悉 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()

事务可以用以确保复杂操作是原子的(例如,查询外键和创建记录),或者提供一个在复杂更改过程中取消的方法。