SqlDelight迁移遇‘尝试修改非表对象’错误求助
解决SqlDelight迁移校验时ALTER TABLE报错的问题
以下是针对你遇到的Attempting to alter something that is not a table错误的排查和解决步骤:
规范迁移文件的命名与存放路径
SqlDelight对迁移文件的规则要求严格:- 命名必须遵循
[旧版本号]-[新版本号].sqm格式,比如从版本1到2的文件要命名为1-2.sqm - 必须和对应数据库的主schema文件(比如
MyDatabase.sq)放在同一目录下,而非和.db文件同目录。举个例子,若你的数据库包路径是com/yourapp/db,迁移文件路径应为src/main/sqldelight/com/yourapp/db/1-2.sqm
- 命名必须遵循
核对迁移语句与主schema的一致性
开启verifyMigration时,SqlDelight会校验迁移后的schema和直接创建新版本schema的结构是否完全匹配。请确认:- 迁移语句中的表名
MyTable和主schema中定义的表名完全一致(注意部分SQL方言的大小写敏感性) - 新增列的定义(类型、默认值等)和主schema中v2版本的列定义完全相同,比如迁移语句的
TEXT DEFAULT ""要和主schema里的写法一致
- 迁移语句中的表名
检查SQL语法的正确性
针对SQLite方言,ALTER TABLE ADD COLUMN的标准写法为:ALTER TABLE MyTable ADD COLUMN driverName TEXT DEFAULT '';排查是否存在拼写错误、符号误用(比如引号类型)等问题。
彻底清理SqlDelight生成文件
手动删除项目中SqlDelight的生成目录:- Android项目:
app/build/generated/sqldelight - JVM项目:
build/generated/sqldelight
之后执行generateSqlDelightInterfaceGradle任务,再重新尝试迁移校验。
- Android项目:
统一SqlDelight版本号
确保Gradle配置中插件版本和依赖版本完全一致,避免版本不兼容导致的校验逻辑异常:plugins { id("app.cash.sqldelight") version "2.0.0" // 替换为你使用的版本 } dependencies { implementation("app.cash.sqldelight:sqlite-driver:2.0.0") }
内容的提问来源于stack exchange,提问作者Alessio Toma
相关产品推荐
相关产品推荐

