複数行のSQL発行用メソッドを用意した。
成果物
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 2018-06-27
- Qt 5.7.1
前回
- http://ytyaru.hatenablog.com/entry/2019/12/26/000000
- http://ytyaru.hatenablog.com/entry/2019/12/24/000000
- http://ytyaru.hatenablog.com/entry/2019/12/23/000000
- http://ytyaru.hatenablog.com/entry/2019/12/22/000000
- http://ytyaru.hatenablog.com/entry/2019/12/21/000000
コード抜粋
メソッド | 概要 |
---|---|
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なので困りそう