333 字
1 分钟
【QT】数据库
2026-06-11

模块引入#

qmake

QT += sql

CMake

find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(MyApp Qt6::Sql)
#include <QtSql>
// 或按需:QSqlDatabase, QSqlQuery, QSqlTableModel ...

主要类#

类别类名功能
连接QSqlDatabase建立与管理数据库连接
记录QSqlRecord表中的一行结构
字段QSqlField单个字段元数据
索引QSqlIndex索引信息
模型QSqlTableModel单表可编辑模型,配合 QTableView
模型QSqlQueryModel只读查询结果模型
关系QSqlRelationalTableModel外键关系表
代理QSqlRelationalDelegate关系字段下拉编辑
关系QSqlRelation外键关联描述
执行QSqlQuery执行 SQL
映射QDataWidgetMapper控件与字段绑定
错误QSqlError错误信息

数据库编程模型#

QSqlDatabase::addDatabase(driver) → open()
QSqlQuery / QSqlTableModel
QTableView / QDataWidgetMapper(界面)
  1. 选择驱动并创建连接
  2. open() 打开数据库(文件路径或主机)
  3. QSqlQuery 执行 DDL/DML,或用 QSqlTableModel 做表级 CRUD
  4. 模型 setTable + select() 后绑定视图

SQLite 示例#

SQLite 为嵌入式常用、无需独立服务端的文件数据库,Qt 内置 QSQLITE 驱动。

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydata.db"); // 相对路径或绝对路径
if (!db.open()) {
qWarning() << db.lastError().text();
return;
}

建表与插入(QSqlQuery)#

QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS person ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"name TEXT NOT NULL,"
"age INTEGER)");
query.prepare("INSERT INTO person (name, age) VALUES (:name, :age)");
query.bindValue(":name", "张三");
query.bindValue(":age", 25);
query.exec();

查询#

query.prepare("SELECT id, name, age FROM person WHERE age > :min");
query.bindValue(":min", 18);
if (query.exec()) {
while (query.next()) {
int id = query.value(0).toInt();
QString name = query.value("name").toString();
int age = query.value("age").toInt();
}
}

QSqlTableModel + QTableView#

QSqlTableModel *model = new QSqlTableModel(this, db);
model->setTable("person");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
ui->tableView->setModel(model);
// 编辑后 model->submitAll() 或 revertAll()

其他驱动#

驱动名数据库
QSQLITESQLite
QMYSQLMySQL / MariaDB
QPSQLPostgreSQL
QODBCODBC 通用

使用 MySQL/PostgreSQL 时需编译对应插件或确保 Qt 安装包含该驱动,QSqlDatabase::drivers() 可列出可用驱动。

注意事项#

  • 连接名默认 "qt_sql_default_connection";多连接用 addDatabase(driver, connectionName) 区分。
  • 同一 QSqlDatabase 连接不要跨线程使用;每线程独立连接。
  • 关闭前 db.close()QSqlDatabase::removeDatabase(connectionName) 在连接无引用后移除。
  • 生产环境用预处理与参数绑定,避免 SQL 注入。
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

【QT】数据库
https://lysj.work/posts/studynotes/qt/qt数据库/
作者
Sekiro
发布于
2026-06-11
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录