SQL 모델 클래스 사용
Qt는 QSqlQuery 외에도 데이터베이스 접근을 위한 세 가지 상위 레벨 클래스를 제공합니다. 이러한 클래스는 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()을 명시적으로 호출할 필요가 없다는 약속을 전달하는 것 같습니다. 하지만 두 가지 함정이 있습니다:
- 캐싱이 없으면 성능이 크게 저하될 수 있습니다.
- 기본 키를 수정하는 경우 레코드를 채우려고 시도하는 동안 레코드가 누락될 수 있습니다.
SQL 관계형 테이블 모델
QSqlRelationalTableModel 은 QSqlTableModel 을 확장하여 외래 키를 지원합니다. 외래 키는 한 테이블의 필드와 다른 테이블의 기본 키 필드 간의 1대 1 매핑입니다. 예를 들어 book
테이블에 작성자 테이블의 id
필드를 참조하는 authorid
필드가 있는 경우 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 문서를 참조하세요.
© 2025 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.