はじめに
Flutter開発者として、データベースの操作は日常的な作業の一部であり、その中でもSELECT操作はデータベースから情報を取り出す基本的な方法です。この記事では、FlutterのDriftパッケージを使用してSELECT操作を行う方法を詳しく解説します。
Driftの導入に関してはこちらを参考にしてください
DriftでのSELECT操作
公式のドキュメントを参考にして解説していきます
操作の説明をするためにまずは下記ようなテーブルを定義しています
class Users extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get name => text().withLength(min: 1, max: 50)();
DateTimeColumn get birthday => dateTime().nullable()();
}
全レコード取得
Driftでは、以下のようにしてテーブルからデータを取得します:
final users = await db.select(db.users).get();
1レコードのみ取得
1レコードのみ取得します。ここではデータがなければエラーになります
final users = await db.select(db.users).getSingle();
次にレコードがなければnullを返すようにするには下記のようにします
final users = await db.select(db.users).getSingleOrNull();
条件を指定
特定の条件を満たす行だけを取得することができます。以下のコードは、名前が”Alice”のユーザーだけを取得します
..whereとなっているのはtypoではないです
final aliceUsers = await (db.select(db.users)..where((u) => u.name.equals('Alice'))).get();
ソート
結果を特定の順序でソートすることも可能です。以下のコードは、ユーザーを誕生日の新しい順にソートして取得します
final sortedUsers = await (db.select(db.users)..orderBy([(u) => OrderingTerm(expression: u.birthday, mode: OrderingMode.desc)])).get();
whereと組み合わせる際は下記のようになります
final aliceUsers = await (db.select(db.users)
..where((u) => u.name.equals('Alice'))
..orderBy([
(tbl) => OrderingTerm(expression: tbl.id, mode: OrderingMode.desc)
]))).get();
このコードでは名前がAliceというユーザで誕生日を新しい順にソートして取得します
結合
また、Driftでは複数のテーブルを結合してクエリを実行することも可能です。例えば、ユーザーとその注文を結合するには次のようにします
ordersテーブルを下記のように定義します
.references(Users, #id)
の部分でordersテーブルのuserIdとusersテーブルのidとの関係を定義しています
class Orders extends Table {
IntColumn get id => integer().autoIncrement()();
IntColumn get userId => integer().references(Users, #id)();
TextColumn get product => text().withLength(min: 1, max: 100)();
RealColumn get price => real()();
DateTimeColumn get orderDate => dateTime().nullable()();
}
下記ではusersテーブルのidとordersテーブルのuserIdを結合させてそれぞれのデータを取得しています
final orders = await db.select(db.orders).join([
innerJoin(db.users, db.users.id.equalsExp(db.orders.userId)),
]);
for (final row in orders) {
final order = row.readTable(db.orders);
final user = row.readTable(db.users);
print('User ${user.name} ordered ${order.product}');
}
今回はinnerJoinを利用していますがouterJoinも当然あるので外部結合の場合はこちらを利用してください
まとめ
以上がDriftを使ったSELECT操作の詳細なガイドです。強力なSQLサポートとコンパイル時の型安全性により、DriftはFlutterでのデータベース操作を容易にします。特定の条件で行をフィルタリングしたり、結果を特定の順序でソートしたり、さらには複数のテーブルを結合したりといった複雑なクエリも、簡潔なコードで実現できます。
しかし、上記の例はDriftの提供する機能の一部に過ぎません。Driftはその他にも集約関数、カスタムクエリ、トランザクションのサポートなど、より高度なデータベース操作をサポートしています。また、Driftは非同期プログラミングを深くサポートしており、データベース操作がアプリケーションのパフォーマンスを阻害することなく、スムーズにデータベースの読み書きを行うことができます。