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