From 795b3f1437af474a0d8bd23711d1e0af5f0bb68b Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 21 Apr 2025 14:29:31 +0800 Subject: [PATCH] fix: value update sql --- src/index.test.ts | 11 +++++++++++ src/index.ts | 8 ++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/index.test.ts b/src/index.test.ts index 5342114..4a43297 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -89,4 +89,15 @@ describe('sqlite-level', () => { expect(await result.next()).toEqual('value2') expect(await result.next()).toBeUndefined() }) + + it('value update', async () => { + await level.put('fixed_key1', 'value1') + await level.batch([ + {type: 'put', key: 'fixed_key1', value: 'value2'}, + {type: 'put', key: 'fixed_key2', value: 'value3'}, + {type: 'put', key: 'fixed_key2', value: 'value4'}, + ]) + expect(await level.get('fixed_key1')).toEqual('value2') + expect(await level.get('fixed_key2')).toEqual('value4') + }) }) diff --git a/src/index.ts b/src/index.ts index 1f43863..ad08f7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -207,7 +207,7 @@ export class SqliteLevel extends AbstractL } async _open(options: AbstractOpenOptions, callback: (error?: Error) => void) { - this.db.exec('CREATE TABLE IF NOT EXISTS kv (key TEXT, value TEXT)') + this.db.exec('CREATE TABLE IF NOT EXISTS kv (key TEXT UNIQUE, value TEXT)') this.nextTick(callback) } @@ -240,7 +240,7 @@ export class SqliteLevel extends AbstractL }) ) } - const stmt = this.db.prepare('INSERT INTO kv (key, value) VALUES (?, ?)') + const stmt = this.db.prepare('INSERT INTO kv (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value=excluded.value') stmt.run(key.toString(), value.toString()) this.nextTick(callback) } @@ -277,7 +277,7 @@ export class SqliteLevel extends AbstractL curType = op.type } else if (curType !== op.type) { if (curType === 'put') { - batches.push(`INSERT INTO kv (key, value) VALUES ${curBatch.join(',')}`) + batches.push(`INSERT INTO kv (key, value) VALUES ${curBatch.join(',')} ON CONFLICT(key) DO UPDATE SET value=excluded.value`) } else if (curType === 'del') { batches.push(`DELETE FROM kv WHERE key IN (${curBatch.join(',')})`) } @@ -292,7 +292,7 @@ export class SqliteLevel extends AbstractL } if (curBatch.length > 0) { if (curType === 'put') { - batches.push(`INSERT INTO kv (key, value) VALUES ${curBatch.join(',')}`) + batches.push(`INSERT INTO kv (key, value) VALUES ${curBatch.join(',')} ON CONFLICT(key) DO UPDATE SET value=excluded.value`) } else if (curType === 'del') { batches.push(`DELETE FROM kv WHERE key IN (${curBatch.join(',')})`) }