Compose Multiplatform JS端SqlDelight未初始化数据库,表不存在报错
Compose Multiplatform项目JS Web端SqlDelight表未初始化问题
我开发了一个基于Compose Multiplatform的项目,用SqlDelight管理数据库,iOS和Android端运行正常,但JS Web端虽能执行,却未初始化配置的表,抛出错误:
WebWorkerException: { "message": "no such table: Configs", "name": "Error" }
JS模块Driver类代码
actual class DatabaseDriverFactory : KoinComponent { actual suspend fun createDriver(): SqlDriver { val driver = WebWorkerDriver( Worker( js("""new URL("@cashapp/sqldelight-sqljs-worker/sqljs.worker.js", import.meta.url)""") ) ) try { MyDataBase.Schema.create(driver).await() }catch (e:Exception){ println("error when create ${e.message}") } return driver } }
JS Gradle配置
jsMain.dependencies { implementation(libs.ktor.client.httpjs) implementation(libs.web.drive) implementation(npm("@cashapp/sqldelight-sqljs-worker", "2.0.2")) implementation(npm("sql.js", "1.10.3")) implementation(devNpm("copy-webpack-plugin", "12.0.2")) }
SqlDelight配置
sqldelight { databases { create("MyDataBase") { packageName.set("com.test.compose.mycompose") srcDirs.setFrom("src/commonMain/sqldelight") schemaOutputDirectory.set(file("src/commonMain/sqldelight")) generateAsync = true deriveSchemaFromMigrations.set(true) verifyMigrations.set(true) } } }
.sq文件内容
import kotlin.Boolean; CREATE TABLE Configs( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, firstFetchConfigs INTEGER AS Boolean NOT NULL ); lastConfig: SELECT * FROM Configs ORDER BY id DESC LIMIT 1; insertConfigs: UPDATE Configs SET firstFetchConfigs = :firstFetchConfigs WHERE id = :id; INSERT INTO Configs(id, firstFetchConfigs) VALUES (1, 0);
我已按照官方文档配置项目,并更新了sql.js和copy-webpack-plugin依赖,但问题仍未解决,请问是否遗漏了某些配置?
排查与解决建议
- 检查Schema.create的执行状态:当前的try-catch仅打印异常message,WebWorkerException可能包含更详细的内部错误信息,建议打印完整异常栈(比如
e.printStackTrace()),确认Schema.create是否真的成功执行。 - 确保WebWorker就绪后再创建Schema:WebWorkerDriver的初始化是异步的,可能在调用Schema.create时worker还未完全启动。可以尝试添加等待逻辑,或者改用
WebWorkerDriver的回调确认就绪后再执行创建操作。 - 手动执行初始化INSERT语句:SqlDelight的Schema只包含表结构定义(CREATE TABLE),不会自动执行.sq文件中的INSERT语句。需要在Schema.create完成后,手动调用对应的插入方法执行初始化数据。
- 补全copy-webpack-plugin的配置:仅添加依赖不够,需要在JS模块的
webpack.config.d目录下创建配置文件,将worker.js复制到输出目录:
const CopyWebpackPlugin = require('copy-webpack-plugin'); module.exports = { plugins: [ new CopyWebpackPlugin({ patterns: [ { from: 'node_modules/@cashapp/sqldelight-sqljs-worker/sqljs.worker.js', to: '.' } ] }) ] };
- 验证Schema文件生成与加载:检查
src/commonMain/sqldelight目录下是否生成了正确的Schema文件,确保JS端能正确访问到这些文件,避免路径错误导致Schema未正确加载。
内容的提问来源于stack exchange,提问作者Deybeer Gonzalez
相关产品推荐
相关产品推荐

