Skip to content

ObjectQL未自动同步所有注册对象的表结构(驱动未调用init/ syncSchema) #940

Description

@hotlong

问题描述

当插件(如 plugin-auth)通过 registerService('app.<id>', manifest) 注册对象元数据后,ObjectQLPlugin 能正确调用 ql.registerApp() 并将对象写入 SchemaRegistry

ObjectQLinit() 实现只调用了 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。

建议修复(设计参考)

// 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!['getDriver'](obj.name);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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions