You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SqlDelight 2.0.0中执行增删改操作时如何返回结果?

解决SqlDelight 2.0.0中INSERT/UPDATE/DELETE使用RETURNING报错的问题

问题原因

你使用的SqliteDialect 3_18对应SQLite 3.18版本,而SQLite的RETURNING子句是在3.35.0版本才正式引入的,低版本方言会直接拒绝识别该语法,导致编译报错。

解决方案

方案1:升级SQLite方言版本

将方言替换为支持RETURNING的最低版本(3.35及以上),修改你的Gradle配置:

// 示例Gradle配置(Kotlin DSL)
sqldelight {
  databases {
    create("YourDatabase") {
      dialect = "app.cash.sqldelight.dialects.sqlite_3_35.SqliteDialect"
    }
  }
}

修改后,你的原INSERT语句可正常编译并返回结果:

insertFolder:
INSERT INTO folder
VALUES (?,?)
RETURNING *;

方案2:兼容低版本SQLite的替代方案

如果必须适配不支持RETURNING的旧SQLite版本,可通过分步操作实现返回结果:

插入操作(自增主键场景)

利用SQLite的last_insert_rowid()函数获取刚插入的主键,再查询对应行:

insertFolder:
INSERT INTO folder
VALUES (?,?);

getInsertedFolder:
SELECT * FROM folder
WHERE id = last_insert_rowid();

调用时先执行insertFolder,再执行getInsertedFolder即可拿到插入的记录。

更新操作

先执行UPDATE,再根据更新条件查询修改后的行:

updateFolder:
UPDATE folder
SET name =?
WHERE id =?;

getUpdatedFolder:
SELECT * FROM folder
WHERE id =?;

删除操作

若需返回被删除的记录,需先查询再删除:

getFolderToDelete:
SELECT * FROM folder
WHERE id =?;

deleteFolder:
DELETE FROM folder
WHERE id =?;

调用时先执行getFolderToDelete获取要删除的数据,再执行deleteFolder。

内容的提问来源于stack exchange,提问作者大盗不操戈

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:38:34