複数行の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なので困りそう