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,提问作者大盗不操戈
相关产品推荐
相关产品推荐

