このページでは

SQLモデルクラスの使用

QSqlQuery に加え、Qtではデータベースにアクセスするための3つの高レベルクラスが用意されています。これらは、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(inti= 0; i<model.rowCount();++i) {
        intid=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 から継承されたその他の関数も使用できます。

また、`setQuery()` には、`QSqlQuery ` オブジェクトを受け取り、その結果セットに対して操作を行うオーバーロードも用意されています。これにより、`QSqlQuery ` のあらゆる機能(たとえば、プリペアードクエリなど)を使用してクエリを設定することが可能になります。

SQLテーブルモデル

QSqlTableModel は、一度に 1 つの SQL テーブルに対して動作する読み書きモデルを提供します。

例:

    QSqlTableModel model;
    model.setTable("employee");
    model.setFilter("salary > 50000");
    model.setSort(2,Qt::DescendingOrder);
    model.select();

    for(inti= 0; i<model.rowCount();++i) {
        QString name=model.record(i).value("name").toString();
        intsalary=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()`を明示的に呼び出す必要が一切ないという約束を果たしているようです。ただし、2つの落とし穴があります:

  • キャッシュを一切行わない場合、パフォーマンスが大幅に低下する可能性があります。
  • 主キーを変更した場合、そのレコードをデータセットに追加しようとしている間に、レコードが取りこぼされてしまう可能性があります。

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.