## 问题描述 当插件(如 plugin-auth)通过 `registerService('app.<id>', manifest)` 注册对象元数据后,`ObjectQLPlugin` 能正确调用 `ql.registerApp()` 并将对象写入 `SchemaRegistry`。 但 `ObjectQL` 的 `init()` 实现只调用了 `driver.connect()`,没有取出 SchemaRegistry 里的所有对象并调用驱动的 `init(objects)` 或 `syncSchema(objects)` 来同步表结构。导致如 sys_user 等对象即使注册了,表结构也不会自动变更或创建。 表现为启动后访问用户表时报错: ``` SQLITE_ERROR: no such table: sys_user ``` ## 影响范围 - 任何通过 `registerService('app.<id>', manifest)` 注册对象(如 plugin-auth,plugin-audit 等系统插件)的表结构都不会自动被 driver 初始化/创建 - 使用 Turso/SQLite 驱动时尤其明显 ## 期望行为 - `ObjectQL.init()` 除了调用所有 driver 的 `connect()` 外,还应自动: 1. 统计 SchemaRegistry.getAllObjects() 返回的全部对象定义 2. 遍历所有 driver,调用 `driver.init(objects)` 或 `driver.syncSchema(objects)` 方法完成表结构同步(**幂等**) - 这样所有注册到元数据系统的对象/表都能被自动创建,使用即有,无需手动 migration。 ## 建议修复(设计参考) ```typescript // packages/objectql/src/plugin.ts — ObjectQLPlugin.start() 中 // 在 await this.ql?.init() 之后添加: // Sync all registered object schemas to drivers (idempotent) const allObjects = this.ql?.registry?.getAllObjects?.() ?? []; if (allObjects.length > 0) { ctx.logger.info('Syncing schema for registered objects', { count: allObjects.length }); for (const obj of allObjects) { try { const driver = this.ql; await driver.syncSchema(obj.name, obj); ctx.logger.debug('Schema synced', { object: obj.name }); } catch (e) { ctx.logger.error('Failed to sync schema', e as Error, { object: obj.name }); } } } ``` ## 兼容性与幂等性说明 - 多次调用 `init`/`syncSchema` 必须保持幂等,driver 必须自行判断无需重复建表。 - 建议所有新 driver 均支持 `syncSchema(objects)`,并有注释说明其行为。 ## 相关 issue - #939
Activity
feat(objectql): auto-sync registered object schemas to database on st…