SQLモデルクラスの使用

QSqlQuery に加えて、Qt はデータベースにアクセスするための 3 つの上位クラスを提供しています。これらのクラスはQSqlQueryModelQSqlTableModelQSqlRelationalTableModel です。

QSqlQueryModel任意の SQL クエリに基づく読み取り専用モデル。
QSqlTableModel単一のテーブルで動作する読み書きモデル。
QSqlRelationalTableModel外部キーをサポートするQSqlTableModel サブクラス。

これらのクラスはQAbstractTableModel から派生し (QAbstractItemModel からも派生します)、データベースからのデータをQListViewQTableView のような項目ビュー・クラスで簡単に表示できるようにします。これについては、「テーブル・ビューでデータを表示する」のセクションで詳しく説明します。

これらのクラスを使用するもう1つの利点は、コードを他のデータソースに簡単に適応させることができることです。例えば、QSqlTableModel を使用し、その後データベースの代わりに XML ファイルを使用してデータを保存することにした場合、基本的にはデータモデルを別のものに置き換えるだけです。

SQLクエリーモデル

QSqlQueryModel はSQLクエリに基づいた読み取り専用のモデルを提供します。

    QSqlQueryModelmodel; model.setQuery("SELECT * FROM employee");for(inti= 0; i<model.rowCount();++i) {intid=model.record(i).value("id").toInt();        QStringname=model.record(i).value("name").toString();        qDebug() << id << name;
    }

QSqlQueryModel::setQuery() を使ってクエリを設定した後、QSqlQueryModel::record(int) を使って個々のレコードにアクセスできる。また、QSqlQueryModel::data() や、QAbstractItemModel から継承したその他の関数も使用できます。

QSqlQuery オブジェクトを受け取り、その結果セットを操作するsetQuery() オーバーロードもある。これにより、QSqlQuery の機能を使用してクエリを設定することができます(例:プリペアド・クエリ)。

SQLテーブルモデル

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

    QSqlTableModelmodel; model.setTable("employee"); model.setFilter("salary > 50000"); model.setSort(2Qt::DescendingOrder); model.select();for(inti= 0; i<model.rowCount();++i) { name = model.record(i).value("employee")        QStringname=model.record(i).value("name").toString();intsalary=model.record(i).value("salary").toInt();        qDebug() << name << salary;
    

QSqlTableModel は、個々のSQLテーブルをナビゲートしたり修正したりするための、 に代わる高レベルの方法です。これは通常、より少ないコードで済み、SQL構文の知識を必要としません。QSqlQuery

テーブルの行を取得するには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 は を拡張し、外部キーのサポートを提供します。外部キーとは、あるテーブルのフィールドと別のテーブルの主キー・フィールドを1対1で対応付けるものです。例えば、 テーブルに というフィールドがあり、そのフィールドが author テーブルの フィールドを参照する場合、 が外部キーであると言います。QSqlTableModel book authorid id authorid

左のスクリーンショットは、QTableView の中のプレーンなQSqlTableModel を示しています。外部キー(citycountry )は、人間が読める値には解決されません。右のスクリーンショットは、外部キーが人間が読めるテキスト文字列に解決された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.