如何在 Sqldelight 中使用复合主键从 table 中删除行列表?
How to delete a list of rows from a table using composite primary keys in Sqldelight?
我想删除 table 中的行,给定列表 as_counter,t_ms
并且值 as_counter
和 t_ms
存在于列表中。
数据库
CREATE TABLE Event(
as_counter TEXT NOT NULL,
t_ms TEXT NOT NULL,
event_map TEXT NOT NULL,
PRIMARY KEY (as_counter, t_ms)
);
insertEvent:
INSERT OR REPLACE INTO Event (as_counter, t_ms, event_map)
VALUES (?, ?, ?);
deleteEventListByKey:
DELETE FROM Event
WHERE (as_counter,t_ms) IN (VALUES(?,?))
我试过的方法是deleteEventListByKey。但是我收到了
'(', ')', '.', <binary like operator real>, BETWEEN or IN expected, got ','
的错误。我不确定为什么会收到此错误。
我正在尝试通过的测试用例
@Test
fun `delete events by list of primary keys`() {
queries.insertEvent("1", "1", "{Click,Open}")
queries.insertEvent("1", "2", "{Click,Close},{Read,Open}")
queries.insertEvent("1", "3", "{Click,Open}")
queries.insertEvent("2", "3", "{Click,Open}")
queries.deleteEventsByKey([("1,2"),("1,1")])
assertThat(queries.selectAllEvents().executeAsList())
.containsExactly(
Event(
as_counter = "1",
t_ms = "1",
event_map = "{Click,Open}"
),
Event(
as_counter = "1",
t_ms = "2",
event_map = "{Click,Close},{Read,Open}"
)
)
}
有谁知道如何为 SQLdelight(SQLLite) 编写查询,其中给定列表输入,如果 as_counter
和 t_ms
中存在,则删除 table 中的条目数据库?
这是 SQLdelight 的限制。我最终得到了以下解决方案:
deleteEventListByKey:
DELETE FROM Event
WHERE as_counter || ',' || t_ms IN :countersAndMs
并像这样使用它:
.deleteEventListByKey(
countersAndMs = listOf("1,2", "1,1")
)
或者在一般情况下:
.deleteEventListByKey(
countersAndMs = events.map {
"${it.as_counter},${it.t_ms}"
}
)
这是怎么回事:对于 sql 中的每一行,您都在连接一个字符串(在 sqlite '||' 中将左右属性合并为一个字符串)和所有需要的属性并将其与您必须以相同方式填写的字符串列表进行比较。
请注意,我使用“,”作为分隔符,但如果您的文本数据可能包含此符号,您应该寻找其他符号。
这不是干净的,因为我们松散了类型安全,但我怀疑我们现在还能做些什么。
我想删除 table 中的行,给定列表 as_counter,t_ms
并且值 as_counter
和 t_ms
存在于列表中。
数据库
CREATE TABLE Event(
as_counter TEXT NOT NULL,
t_ms TEXT NOT NULL,
event_map TEXT NOT NULL,
PRIMARY KEY (as_counter, t_ms)
);
insertEvent:
INSERT OR REPLACE INTO Event (as_counter, t_ms, event_map)
VALUES (?, ?, ?);
deleteEventListByKey:
DELETE FROM Event
WHERE (as_counter,t_ms) IN (VALUES(?,?))
我试过的方法是deleteEventListByKey。但是我收到了
'(', ')', '.', <binary like operator real>, BETWEEN or IN expected, got ','
的错误。我不确定为什么会收到此错误。
我正在尝试通过的测试用例
@Test
fun `delete events by list of primary keys`() {
queries.insertEvent("1", "1", "{Click,Open}")
queries.insertEvent("1", "2", "{Click,Close},{Read,Open}")
queries.insertEvent("1", "3", "{Click,Open}")
queries.insertEvent("2", "3", "{Click,Open}")
queries.deleteEventsByKey([("1,2"),("1,1")])
assertThat(queries.selectAllEvents().executeAsList())
.containsExactly(
Event(
as_counter = "1",
t_ms = "1",
event_map = "{Click,Open}"
),
Event(
as_counter = "1",
t_ms = "2",
event_map = "{Click,Close},{Read,Open}"
)
)
}
有谁知道如何为 SQLdelight(SQLLite) 编写查询,其中给定列表输入,如果 as_counter
和 t_ms
中存在,则删除 table 中的条目数据库?
这是 SQLdelight 的限制。我最终得到了以下解决方案:
deleteEventListByKey:
DELETE FROM Event
WHERE as_counter || ',' || t_ms IN :countersAndMs
并像这样使用它:
.deleteEventListByKey(
countersAndMs = listOf("1,2", "1,1")
)
或者在一般情况下:
.deleteEventListByKey(
countersAndMs = events.map {
"${it.as_counter},${it.t_ms}"
}
)
这是怎么回事:对于 sql 中的每一行,您都在连接一个字符串(在 sqlite '||' 中将左右属性合并为一个字符串)和所有需要的属性并将其与您必须以相同方式填写的字符串列表进行比较。
请注意,我使用“,”作为分隔符,但如果您的文本数据可能包含此符号,您应该寻找其他符号。
这不是干净的,因为我们松散了类型安全,但我怀疑我们现在还能做些什么。