## 问题描述 ObjectQL 引擎当前的 `init()` 方法只负责调用所有数据驱动(driver)的 `connect()`,但**不会自动同步步骤中注册到 SchemaRegistry 的对象定义(object schema)到实际数据库表结构**。这导致 app 插件(如 plugin-auth、plugin-audit 等)注册的对象(如 `sys_user` 等)虽然元数据已加载,但数据表可能未被自动创建��更新——首次访问时会出现 `SQLITE_ERROR: no such table: sys_user` 等报错。 ## 影响范围 - 所有通过 `registerService('app.<id>', manifest)` 注册的对象无法保证表结构自动同步到数据库 - plugin-auth、plugin-audit 等系统插件下的用户/审计等核心表不会自动初始化 - 使用 SQLite/Turso 等"需自动建表"的驱动时表现尤为明显 ## 期望行为 - ObjectQL 应在启动流程中,**自动遍历所有注册对象(SchemaRegistry.getAllObjects())并调用各 driver 的 `syncSchema(object, schema)`** 方法完成表结构同步 - 同步操作需保证**幂等**(多次 sync 不会重复建表或报错,兼容字段/索引新增) - 该逻辑应在 Plugin 层(即 ObjectQLPlugin.start() 的 init() 之后)实现,**逐对象调用 syncSchema**,而不是批量传递对象数组(符合[协议定义](https://github.com/objectstack-ai/spec/blob/main/packages/spec/src/contracts/data-driver.ts#L157)) ## 推荐修复方案 ```typescript // packages/objectql/src/plugin.ts // ObjectQLPlugin.start() 中 await this.ql?.init() 后新增: const allObjects = this.ql?.registry?.getAllObjects?.() ?? []; if (allObjects.length > 0) { for (const obj of allObjects) { const driver = this.ql!.getDriver(obj.name); await driver.syncSchema(obj.name, obj); // 符合 syncSchema 单对象签名 } } ``` - 若 driver 不支持 syncSchema,需有容错日志 - 不建议将 schema 同步逻辑下沉到 ObjectQL.init(),应保持边界分明(Plugin/Kernel 层负责 orchestrate,Engine 层只负责 registry+connect) ## 协议兼容性检查 - syncSchema(idempotent) 方法已在 [data-driver.ts 协议定义](https://github.com/objectstack-ai/spec/blob/main/packages/spec/src/contracts/data-driver.ts#L157) 和 Zod schema 中声明 - 多驱动、插件动态注册均适配(按需调用 getDriver) - 完全符合"Data as Code/幂等基建"理念 ## 相关链接 - [#939](https://github.com/objectstack-ai/spec/issues/939)(注册 app/objects 问题,已解决) - [syncSchema 协议签名](https://github.com/objectstack-ai/spec/blob/main/packages/spec/src/contracts/data-driver.ts#L157) - [ObjectQLPlugin.start 源码](https://github.com/objectstack-ai/spec/blob/main/packages/objectql/src/plugin.ts) --- > 注:本 Issue 属于 runtime/实现补丁,不涉及协议定义变更。
Activity