[flutter]driftを触ってみる
flutter favoriteに入っている
sqfliteの上に作られている。
sqfliteに比べて以下のメリットがある。cf. https://drift.simonbinder.eu/faq/#sqflite-sqlite3
- Generating typesafe mapping code for your queries
- Providing auto-updating streams for queries
- Managing CREATE TABLE statements and most schema migrations
- A more fluent api to compose queries
DBの中を見る方法
https://pub.dev/packages/drift_db_viewer でアプリ内から見れる
柔軟にクエリが実行できて便利
PCから見たければ
Android端末内部のsqliteファイルをPCにコピーした上で
SQLiteBrowserから見る
cf. https://zenn.dev/8yabusa/scraps/715863fa75a95b
cf. https://zenn.dev/taji/books/6485426f8353b3/viewer/8fc587
疑問
SQLiteはOSに入っているものを使っているのか、ライブラリ側で用意しているのか?
疑問を持った理由
upsertを使っていいのかわからなかったため。
https://www.sqlite.org/lang_upsert.html
UPSERT syntax was added to SQLite with version 3.24.0 (2018-06-04).
Upsertは3.24 から入っている
AndroidOSごとのSQliteのバージョン
Version of SQLite used in Android?
30 11 R 3.28.0 window functions
29 10 Q 3.22.0
ということは Android R 以降じゃないと Upsert(on conflict update) は使えない??
結論
upsertも使える。
sqlite3_flutter_libs が最新のSQLiteを内包しているので、OSのSQLiteは気にしなくて良い。
調査
driftはsqlite3_flutter_libsと一緒に使う
dependencies:
drift: ^1.6.0
sqlite3_flutter_libs: ^0.5.0
path_provider: ^2.0.0
path: ^1.8.1
sqlite3_flutter_libs
: Ships the latestsqlite3
version with your Android or iOS app. This is not required when you're not using Flutter, but then you need to take care of includingsqlite3
yourself. For an overview on other platforms, see platforms.
(deepL訳) sqlite3_flutter_libs
: 最新の sqlite3
バージョンを Android または iOS アプリと一緒に出荷する。
sqlite3_flutter_libs の内部調査
sqlite3_flutter_libs:
dependency: "direct main"
description:
name: sqlite3_flutter_libs
url: "https://pub.dartlang.org"
source: hosted
version: "0.5.6"
0.5.6
Update sqlite to version 3.38.3
sqliteのバージョン管理してるっぽい
コード仕込んで確認
mainとかで以下のコードを仕込んで確認
Android OS 5.1のエミュレータ でも 3.38.3 が出力された
import 'package:sqlite3/sqlite3.dart';
logger.i('use sqlite3 ${sqlite3.version}');
// use sqlite3 Version(libVersion: 3.38.3, sourceId: 2022-04-27 12:03:15 9547e2c38a1c6f751a77d4d796894dec4dc5d8f5d79b1cd39e1ffc50df7b3be4, number: 3038003)
SQLiteを取り込んでる箇所
Android
implementation 'eu.simonbinder:sqlite3-native-library:3.38.5'
Android library containing a precompiled version of sqlite3.
iOS
s.dependency 'sqlite3', '~> 3.38.5'
SQLite is an embedded SQL database engine
Streamの実装を見る
以下の記事のBehaviorSubjectの実装と似ている
デフォルトだとforeign key が効かない
SQLiteの特徴っぽい。以下で効くようになる
MigrationStrategy get migration => MigrationStrategy(
beforeOpen: (details) async {
await customStatement('PRAGMA foreign_keys = ON');
},
);
参考
- driftのissue
- SQLiteのドキュメント
- https://www.sqlite.org/foreignkeys.html
-
Assuming the library is compiled with foreign key constraints enabled, it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command. For example:
migration
schemaVersionは
SQLiteのschema.user_versionに対応するっぽい
DBBrowser for SQLiteで schemaVersionに応じてuser_versionが変化することを確認