やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

QtでSQLite3を使うラッパクラスを作ってみた2

 複数行のSQL発行用メソッドを用意した。

成果物

github.com

対象環境

  • Raspbierry pi 3 Model B+
  • Raspbian stretch 2018-06-27
  • Qt 5.7.1

前回

コード抜粋

メソッド 概要
QSqlQuery Query(QString query) SQLを1行発行する
void Query(QStringList queries) SQLを複数行発行する

 実装内容がほぼ同じでコードが重複しまくっているのがダサい。Pythonのデコレータを使えば重複を回避できると思うのだが。

 呼出側は以下。

    QtSqliteDb db("Memo", QApplication::applicationDirPath());
    db.Query(tr("create table Memo(id INTEGER PRIMARY KEY AUTOINCREMENT, Memo TEXT, Created TEXT)"));
    db.Query(tr("insert into Memo(Memo,Created) values('メモ内容', '1999-12-31 23:59:59')"));
    QSqlQuery query = db.Query(tr("select * from Memo"));
    while (query.next()) {
        qDebug() << query.value(0) << "|" << query.value(1) << "|" << query.value(2);
    }

 SQL複数行は以下。

    QStringList queries;
    queries.append("insert into Memo(Memo,Created) values('あああ', '1999-12-31 23:59:59')");
    queries.append("insert into Memo(Memo,Created) values('いいい', '1999-12-31 23:59:59')");
    db.Query(queries);

SQL実行時エラーをqDebugで表示するようにした

 QSqlErrorというやつを使った。

qtsqlitedb.cpp

QSqlQuery QtSqliteDb::Query(QString query)
{
    QSqlDatabase db = QSqlDatabase::database(this->dbName);
    db.transaction();
    try {
        QSqlQuery q(db);
        q.exec(query);
        QSqlError err = q.lastError();
        if (!err.text().trimmed().isEmpty()) { qDebug() << "SQLieteError: " << err.text(); }
        db.commit();
        qDebug() << "QSqlDatabase::commit(): " << query;
        return q;
    } catch (...) {
        qDebug() << "QSqlDatabase::rollback(): " << query;
        db.rollback();
    }
}

複数行のSQLを実行するメソッドを作った

 引数がQStringでなくQStringListのメソッド。戻り値がない。複数のInsert文を実行することを想定。

void QtSqliteDb::Query(QStringList queries)
{
    QSqlDatabase db = QSqlDatabase::database(this->dbName);
    db.transaction();
    try {
        QSqlQuery q(db);
        foreach (QString query, queries) {
            q.exec(query);
            QSqlError err = q.lastError();
            if (!err.text().trimmed().isEmpty()) { qDebug() << "SQLieteError: " << err.text() << "\n" << query << ": "; }
        }
        qDebug() << "QSqlDatabase::commit()" << queries;
        db.commit();
    } catch (...) {
        qDebug() << "QSqlDatabase::rollback()" << queries;
        db.rollback();
    }
}

所感

  • Create Table, Select, Insert, Update, Delete文くらいはもっとスマートに書きたい
  • Select文の戻り値は型がQVariantなので困りそう