Drift vs Isar 对比

SQLite 的强大 + Dart 的类型安全——对懂 SQL 的人来说是自然的选择

VS
Isar

NoSQL 的速度与简洁——但首先要选对包

9 分钟阅读数据库

快速结论

明确的答案是:如果你的数据模型是关系型的,且团队具备 SQL 知识,Drift 是更稳妥的选择——2.35.0 版本发布于 2026-09-09,最近一次提交在 2026-09-24,月下载量超过 130 万。在 Isar 这边,唯一关键的一点是 pubspec.yaml 中要写的是 `isar_community`;原始的 `isar` 包自 2023 年起就已经停滞。该分支(fork)依然活跃,对于类文档型数据(缓存、模式灵活的笔记)仍然是合理的选择。

DriftIsar
阅读完整结论

评分对比

图表加载中…

详细评分

详细评分: Drift 和 Isar ——按类别打分,满分 10 分
分类DriftIsar
性能
8/10
8/10
学习难易度
6/10
8/10
生态系统
9/10
5/10
社区
8/10
5/10
就业市场
6/10
5/10
面向未来
9/10
6/10

优缺点

Drift

优点

  • 既可以手写 SQL,也可以用 Dart fluent API 编写查询——两者都在编译期得到验证
  • 关系型建模(join、外键、view)比 NoSQL 强大得多
  • 通过响应式的 .watch() 数据流,可以实时监听查询结果
  • 支持多种后端,包括 sqflite、原生 sqlite3,甚至 Postgres(drift_postgres)
  • 积极开发中:最新版本 2.35.0(2026 年 9 月 9 日),GitHub 最近一次提交在 2026 年 9 月 24 日
  • 在 pub.dev 上拥有 flutter-favorite 标签,pub point 为 160/160——生态系统信任度高
  • Web/WASM 支持正在积极开发中,对跨平台目标有优势
  • MIT 许可证,完全免费,通过 GitHub Sponsors 实现可持续的资金模式

缺点

  • 必须使用 drift_dev + build_runner——每次修改 schema 都要重新运行代码生成
  • 对不懂 SQL 的团队来说,学习曲线更陡
  • 样板代码较多:表定义、DAO、迁移策略都需要手写
  • 相比 Isar 隐式的 schema 演进,Drift 的迁移需要更多手写代码
  • isolate 的使用并非默认开启——需要通过 `NativeDatabase.createInBackground` 有意识地开启

最适合

具有关系型数据模型的中大型 Flutter 应用具备 SQL 知识的团队,以及从后端转向移动端的开发者需要复杂查询/join 的离线优先(offline-first)架构以 Web(WASM)为目标的跨平台项目预计需要长期维护的大型代码库

Isar

优点

  • 不需要 SQL 知识——直接保存带注解的 Dart 类
  • 内置全文搜索(full-text search),开箱即用
  • 内置多重索引(复合/多条目)和 ACID 事务
  • 默认支持多 isolate 并行查询——在 Drift 中这需要一行代码手动开启
  • 相比 Drift,学习曲线更平缓:样板代码更少
  • 开发工作通过社区分支 isar_community 持续进行(最近一次提交在 2026 年 9 月 8 日)
  • Apache-2.0 许可证,完全免费

缺点

  • ⚠️ 原始的 `isar` 包实际上已被放弃:最新版本发布于 2023-04-25,GitHub 上最后一次代码推送在 2025-06-14——新项目不应使用
  • 正确的包是 `isar_community`(分支)——但 pub.dev 下载量约为 Drift 的 1/13
  • 关系型查询(join、窗口函数)不如 Drift 强大
  • iOS 隐私清单(privacy manifest)只有分支版本才有:`isar_community_flutter_libs` 会附带 `PrivacyInfo.xcprivacy`,而旧的 `isar` 包(3.1.0+1,2023-04-25)是清单要求出现之前的版本
  • 仍然需要 `isar_community_generator`(在旧的 `isar` 包中为 `isar_generator`)+ build_runner 进行代码生成,并非完全没有样板代码
  • 官方基准测试页面已不再可用(isar.dev/benchmarks.html 返回 404)——没有最新的、可验证的性能参考

最适合

类文档型、非关系型的数据模型快速原型开发和 MVP(样板代码少)需要全文搜索的离线优先(offline-first)应用不懂 SQL 的小型团队

代码对比

Drift
// Drift - 表定义 + 响应式查询 (drift.simonbinder.eu/setup/)
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;

part 'database.g.dart';

class Todos extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get title => text().withLength(min: 1, max: 200)();
  BoolColumn get isDone => boolean().withDefault(const Constant(false))();
}

@DriftDatabase(tables: [Todos])
class AppDatabase extends _$AppDatabase {
  AppDatabase() : super(_openConnection());

  @override
  int get schemaVersion => 1;

  // 响应式数据流:表发生变化时自动推送
  Stream<List<Todo>> watchPendingTodos() {
    return (select(todos)..where((t) => t.isDone.equals(false))).watch();
  }

  Future<int> addTodo(String title) {
    return into(todos).insert(TodosCompanion.insert(title: title));
  }
}

LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'db.sqlite'));
    return NativeDatabase.createInBackground(file);
  });
}
Isar
// isar_community - 集合定义 + 查询 (pub.dev/packages/isar_community readme 示例模式)
import 'package:isar_community/isar.dart';
import 'package:path_provider/path_provider.dart';

part 'todo.g.dart';

@collection
class Todo {
  Id id = Isar.autoIncrement;

  @Index()
  late String title;

  bool isDone = false;
}

Future<Isar> openDb() async {
  final dir = await getApplicationDocumentsDirectory();
  return Isar.open(
    [TodoSchema],
    directory: dir.path,
  );
}

Future<void> addTodo(Isar isar, String title) async {
  final todo = Todo()..title = title;
  await isar.writeTxn(() async {
    await isar.todos.put(todo);
  });
}

// 响应式查询:集合发生变化时自动推送
Stream<List<Todo>> watchPendingTodos(Isar isar) {
  return isar.todos.filter().isDoneEqualTo(false).watch(fireImmediately: true);
}

结论

明确的答案是:如果你的数据模型是关系型的,且团队具备 SQL 知识,Drift 是更稳妥的选择——2.35.0 版本发布于 2026-09-09,最近一次提交在 2026-09-24,月下载量超过 130 万。在 Isar 这边,唯一关键的一点是 pubspec.yaml 中要写的是 `isar_community`;原始的 `isar` 包自 2023 年起就已经停滞。该分支(fork)依然活跃,对于类文档型数据(缓存、模式灵活的笔记)仍然是合理的选择。

获取免费咨询
常见问题

常见问题

在新项目中一定要使用 isar_community。原始的 isar 包在 pub.dev 上自 2023-04-25 起、在 GitHub 上自 2025-06-14 起就再未更新——实际上已被放弃。isar_community 是社区接手维护的活跃分支,如今提到“Isar”指的应该就是这个包。

相关博客文章

查看全部文章

相关项目

查看全部项目
全部对比