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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:36:00