更新upsert

This commit is contained in:
Happi (哈比)
2026-03-10 12:41:02 +08:00
parent 56bdae8db3
commit 1c996075e3
5 changed files with 91 additions and 15 deletions

View File

@@ -49,6 +49,30 @@ class DatabaseRepositoryImpl implements DatabaseRepository {
);
}
@override
Future<void> insertOnConflictUpdate<T extends Table, D>(
TableInfo<T, D> table,
Insertable<D> companion,
) async {
final db = _db;
if (db == null) return;
await db.into(table).insertOnConflictUpdate(companion);
}
@override
Future<void> batchInsertOnConflictUpdate<T extends Table, D>(
TableInfo<T, D> table,
List<Insertable<D>> companions,
) async {
final db = _db;
if (db == null) return;
await db.transaction(() async {
for (final companion in companions) {
await db.into(table).insertOnConflictUpdate(companion);
}
});
}
// ── 更新 ─────────────────────────────────────────────────────────────────
@override

View File

@@ -13,7 +13,10 @@ import 'package:drift/drift.dart';
abstract class DatabaseRepository {
// ── 插入 ─────────────────────────────────────────────────────────────────
/// 插入或替换(主键冲突时覆盖)。
/// 插入或替换(主键冲突时删除原行再插入)。
///
/// 注意:底层是 DELETE + INSERTrowid 变更,触发 DELETE 级联。
/// 如需原地更新,请使用 [insertOnConflictUpdate]。
Future<void> insertOrReplace<T extends Table, D>(
TableInfo<T, D> table,
Insertable<D> companion,
@@ -25,12 +28,35 @@ abstract class DatabaseRepository {
Insertable<D> companion,
);
/// 批量插入或替换。
/// 批量插入或替换(主键冲突时删除原行再插入)
///
/// 注意:底层是 DELETE + INSERTrowid 变更,触发 DELETE 级联。
/// 如需原地更新,请使用 [batchInsertOnConflictUpdate]。
Future<void> batchInsertOrReplace<T extends Table, D>(
TableInfo<T, D> table,
List<Insertable<D>> companions,
);
/// 插入主键冲突时原地更新全部字段INSERT ... ON CONFLICT DO UPDATE SET
///
/// 与 [insertOrReplace] 的区别:
/// - [insertOrReplace] → DELETE + INSERTrowid 变更,触发 DELETE 级联
/// - [insertOnConflictUpdate] → 原地 UPDATErowid 不变,不触发 DELETE 级联
///
/// 适用场景upsert 语义,且不希望影响依赖 rowid 的其他逻辑。
Future<void> insertOnConflictUpdate<T extends Table, D>(
TableInfo<T, D> table,
Insertable<D> companion,
);
/// 批量插入,主键冲突时原地更新全部字段。
///
/// 与 [batchInsertOrReplace] 的区别同 [insertOnConflictUpdate]。
Future<void> batchInsertOnConflictUpdate<T extends Table, D>(
TableInfo<T, D> table,
List<Insertable<D>> companions,
);
// ── 更新 ─────────────────────────────────────────────────────────────────
/// 按条件更新。

View File

@@ -79,7 +79,10 @@ abstract class StorageSdkApi {
// ── 插入 ─────────────────────────────────────────────────────────────────
/// 插入或替换(主键冲突时覆盖)。
/// 插入或替换(主键冲突时删除原行再插入)。
///
/// 注意:底层是 DELETE + INSERT会导致 rowid 变更,并触发 DELETE 级联。
/// 如需原地更新,请使用 [insertOnConflictUpdate]。
///
/// 示例:
/// ```dart
@@ -92,9 +95,26 @@ abstract class StorageSdkApi {
/// 插入或忽略(主键冲突时跳过)。
Future<void> insert<D>(Insertable<D> companion);
/// 批量插入或替换。
/// 批量插入或替换(主键冲突时删除原行再插入)
///
/// 注意:底层是 DELETE + INSERTrowid 变更,触发 DELETE 级联。
/// 如需原地更新,请使用 [batchInsertOnConflictUpdate]。
Future<void> batchInsertOrReplace<D>(List<Insertable<D>> companions);
/// 插入主键冲突时原地更新全部字段INSERT ... ON CONFLICT DO UPDATE SET
///
/// 与 [insertOrReplace] 的区别:
/// - [insertOrReplace] → DELETE + INSERTrowid 变更,触发 DELETE 级联
/// - [insertOnConflictUpdate] → 原地 UPDATErowid 不变,不触发 DELETE 级联
///
/// 适用场景upsert 语义,且不希望影响依赖 rowid 的其他逻辑。
Future<void> insertOnConflictUpdate<D>(Insertable<D> companion);
/// 批量插入,主键冲突时原地更新全部字段。
///
/// 与 [batchInsertOrReplace] 的区别同 [insertOnConflictUpdate]。
Future<void> batchInsertOnConflictUpdate<D>(List<Insertable<D>> companions);
// ── 更新 ─────────────────────────────────────────────────────────────────
/// 按条件更新。

View File

@@ -67,6 +67,14 @@ class StorageSdkApiImpl implements StorageSdkApi, StorageSdkLifecycle {
Future<void> batchInsertOrReplace<D>(List<Insertable<D>> companions) =>
_core.repo.batchInsertOrReplace(_tableFor<Table, D>(), companions);
@override
Future<void> insertOnConflictUpdate<D>(Insertable<D> companion) =>
_core.repo.insertOnConflictUpdate(_tableFor<Table, D>(), companion);
@override
Future<void> batchInsertOnConflictUpdate<D>(List<Insertable<D>> companions) =>
_core.repo.batchInsertOnConflictUpdate(_tableFor<Table, D>(), companions);
// ── 更新 ─────────────────────────────────────────────────────────────────
@override