SQL 모델 클래스 사용
QSqlQuery 외에도 Qt는 데이터베이스에 접근하기 위한 세 가지 상위 레벨 클래스를 제공합니다. 이 클래스들은 QSqlQueryModel, QSqlTableModel, QSqlRelationalTableModel 입니다.
| QSqlQueryModel | 임의의 SQL 쿼리를 기반으로 하는 읽기 전용 모델입니다. |
| QSqlTableModel | 단일 테이블에서 작동하는 읽기-쓰기 모델입니다. |
| QSqlRelationalTableModel | 외래 키를 지원하는 ` QSqlTableModel `의 하위 클래스입니다. |
이 클래스들은 QAbstractTableModel (이 클래스는 다시 QAbstractItemModel 를 상속받음)에서 파생되며, QListView 및 QTableView 와 같은 항목 뷰 클래스에서 데이터베이스 데이터를 쉽게 표시할 수 있게 해줍니다. 이에 대한 자세한 내용은 ‘테이블 뷰에서 데이터 표시’ 섹션에서 설명합니다.
이러한 클래스를 사용하는 또 다른 장점은 코드를 다른 데이터 소스에 더 쉽게 적용할 수 있다는 점입니다. 예를 들어, QSqlTableModel 를 사용하다가 나중에 데이터베이스 대신 XML 파일을 사용하여 데이터를 저장하기로 결정한 경우, 본질적으로 하나의 데이터 모델을 다른 데이터 모델로 교체하기만 하면 됩니다.
SQL 쿼리 모델
QSqlQueryModel SQL 쿼리를 기반으로 한 읽기 전용 모델을 제공합니다.
예시:
QSqlQueryModel model;
model.setQuery("SELECT * FROM employee");
for (int i = 0; i < model.rowCount();++i) {
int id = model.record(i).value("id").toInt();
QString name = model.record(i).value("name").toString();
qDebug() << id << name;
}QSqlQueryModel::setQuery()를 사용하여 쿼리를 설정한 후에는 QSqlQueryModel::record(int)를 사용하여 개별 레코드에 액세스할 수 있습니다. 또한 QSqlQueryModel::data() 및 QAbstractItemModel 에서 상속받은 다른 함수들을 사용할 수도 있습니다.
또한 QSqlQuery 객체를 인수로 받아 해당 결과 집합을 대상으로 연산을 수행하는 setQuery() 오버로드도 있습니다. 이를 통해 QSqlQuery 의 모든 기능(예: 준비된 쿼리)을 사용하여 쿼리를 설정할 수 있습니다.
SQL 테이블 모델
QSqlTableModel 한 번에 하나의 SQL 테이블을 대상으로 하는 읽기-쓰기 모델을 제공합니다.
예시:
QSqlTableModel model;
model.setTable("employee");
model.setFilter("salary > 50000");
model.setSort(2, Qt::DescendingOrder);
model.select();
for (int i = 0; i < model.rowCount();++i) {
QString name = model.record(i).value("name").toString();
int salary = model.record(i).value("salary").toInt();
qDebug() << name << salary;
}QSqlTableModel 는 개별 SQL 테이블을 탐색하고 수정하기 위한 QSqlQuery 의 고수준 대안입니다. 일반적으로 코드 양을 줄여주며, SQL 구문에 대한 지식이 필요하지 않습니다.
QSqlTableModel::record()를 사용하여 테이블의 행을 가져오고, QSqlTableModel::setRecord()를 사용하여 행을 수정합니다. 예를 들어, 다음 코드는 모든 직원의 급여를 10% 인상합니다:
for (int i = 0; i < model.rowCount(); ++i) {
QSqlRecord record = model.record(i);
double salary = record.value("salary").toInt();
salary *= 1.1;
record.setValue("salary", salary);
model.setRecord(i, record);
}
model.submitAll();QAbstractItemModel 에서 상속받은 QSqlTableModel::data() 및 QSqlTableModel::setData()을 사용하여 데이터에 접근할 수도 있습니다. 예를 들어, setData()을 사용하여 레코드를 업데이트하는 방법은 다음과 같습니다:
model.setData(model.index(row, column), 75000);
model.submitAll();다음은 행을 삽입하고 데이터를 채우는 방법입니다:
model.insertRows(row, 1);
model.setData(model.index(row, 0), 1013);
model.setData(model.index(row, 1), "Peter Gordon");
model.setData(model.index(row, 2), 68500);
model.submitAll();연속된 5개의 행을 삭제하는 방법은 다음과 같습니다:
model.removeRows(row, 5);
model.submitAll();QSqlTableModel::removeRows() 함수의 첫 번째 인수는 삭제할 첫 번째 행의 인덱스입니다.
레코드를 수정한 후에는 변경 사항이 데이터베이스에 제대로 저장되도록 항상 QSqlTableModel::submitAll()을 호출해야 합니다.
submitAll()을 실제로 호출해야 하는지, 그리고 언제 호출해야 하는지는 테이블의 edit strategy 에 따라 다릅니다. 기본 전략은 QSqlTableModel::OnRowChange 이며, 이는 사용자가 다른 행을 선택할 때 보류 중인 변경 사항이 데이터베이스에 적용되도록 지정합니다. 다른 전략으로는 QSqlTableModel::OnManualSubmit (submitAll()을 호출할 때까지 모든 변경 사항이 모델에 캐시됨)와 QSqlTableModel::OnFieldChange (변경 사항이 캐시되지 않음)이 있습니다. 이러한 전략은 주로 QSqlTableModel 가 뷰와 함께 사용될 때 유용합니다.
QSqlTableModel::OnFieldChange 는 submitAll()을 명시적으로 호출할 필요가 없다는 약속을 지켜주는 것처럼 보입니다. 하지만 두 가지 함정이 있습니다:
- 캐싱이 전혀 없으면 성능이 크게 저하될 수 있습니다.
- 주키(primary key)를 수정할 경우, 레코드를 채우려는 도중에 해당 레코드가 누락될 수 있습니다.
SQL 관계형 테이블 모델
QSqlRelationalTableModel 는 QSqlTableModel 을 확장하여 외래 키를 지원합니다. 외래 키는 한 테이블의 필드와 다른 테이블의 기본 키 필드 간의 1대1 매핑을 의미합니다. 예를 들어, ` book ` 테이블에 ` authorid `라는 필드가 있고, 이 필드가 `author` 테이블의 ` id ` 필드를 참조한다면, ` authorid `는 외래 키라고 합니다.
![]() | ![]() |
왼쪽 스크린샷은 QTableView 내의 일반 QSqlTableModel 를 보여줍니다. 외래 키(city 및 country)는 사람이 읽을 수 있는 값으로 변환되지 않습니다. 오른쪽 스크린샷은 외래 키가 사람이 읽을 수 있는 텍스트 문자열로 변환된 QSqlRelationalTableModel 를 보여줍니다.
다음 코드 스니펫은 QSqlRelationalTableModel 이 어떻게 설정되었는지 보여줍니다:
model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));
model->setRelation(3, QSqlRelation("country", "id", "name"));자세한 내용은 QSqlRelationalTableModel 문서를 참조하십시오.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.

