333 字
1 分钟
【QT】数据库
模块引入
qmake:
QT += sqlCMake:
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(界面)- 选择驱动并创建连接
open()打开数据库(文件路径或主机)- 用
QSqlQuery执行 DDL/DML,或用QSqlTableModel做表级 CRUD - 模型
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()其他驱动
| 驱动名 | 数据库 |
|---|---|
QSQLITE | SQLite |
QMYSQL | MySQL / MariaDB |
QPSQL | PostgreSQL |
QODBC | ODBC 通用 |
使用 MySQL/PostgreSQL 时需编译对应插件或确保 Qt 安装包含该驱动,QSqlDatabase::drivers() 可列出可用驱动。
注意事项
- 连接名默认
"qt_sql_default_connection";多连接用addDatabase(driver, connectionName)区分。 - 同一
QSqlDatabase连接不要跨线程使用;每线程独立连接。 - 关闭前
db.close();QSqlDatabase::removeDatabase(connectionName)在连接无引用后移除。 - 生产环境用预处理与参数绑定,避免 SQL 注入。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐
1
【QT】多媒体
StudyNotes 介绍 Qt6 多媒体模块、QMediaPlayer 音视频播放、摄像头预览及 Qt5/Qt6 差异。
2
【QT】多线程
StudyNotes 介绍 QThread 两种用法、QtConcurrent、线程同步及跨线程更新 UI 的注意事项。
3
【QT】布局与QSS
StudyNotes 介绍 QHBoxLayout 等布局管理、QSS 选择器语法及与 QPalette、QStyle 的关系。
4
【QT】网络编程
StudyNotes 介绍 QTcpSocket、QUdpSocket、QNetworkAccessManager 及 SSL 等 Qt 网络编程 API。
5
【QT】交叉编译与部署
StudyNotes 以 NXP i.MX 为例说明交叉工具链配置、Qt Creator Kits 及嵌入式板端部署要点。
