Skip to content

cli/runtime: explicit driver(--database-driver / OS_DATABASE_DRIVER)在 CLI 与 standalone stack 之间仍有三处分叉(#6265 后续) #6345

Description

@qq9340100

发现于 #6265 的实施(PR #6344)。#6344 的裁决面是「mysql:// 识别」+「env 值过 zod enum 真校验」,这三处都不在其中,顺手改等于在未裁的情况下扩/收契约,故另记、未认领。

⚠️ 开 issue 前的查重只跑通了两条(storage-driver 别名"OS_DATABASE_DRIVER" alias 词表,均 0 命中),其余查询撞上 GitHub search 速率限制。若与既有 issue 重复,请直接关掉。

背景

#6344 之后,OS_DATABASE_DRIVER 的未知值在 standalone stack(os migrate / createStandaloneStack / 嵌入方)会响亮拒绝并列出合法值,不再静默落 SQLite。这消灭了「静默连错库」,但没有让两侧的 explicit-driver 口径一致 —— 下面三条都是「不再静默,但仍不一致」。

(1) 别名词表两侧不同

  • CLI(packages/cli/src/utils/storage-driver.ts resolveStorageDefinition)接受:mongodb|mongosqlite|sqlsqlite-wasm|wasm-sqlite|wasmpostgres|postgresql|pgmysql|mysql2turso|libsqlmemory|mingo|in-memory;
  • standalone stack(packages/runtime/src/standalone-stack.ts StandaloneDatabaseDriverSchema,feat(runtime): standalone stack 认 mysql://,并对 OS_DATABASE_DRIVER 做真校验 (#6265) #6344 后)只收规范拼写:sqlitesqlite-wasmmemorypostgresmysqlmongodbturso;
  • content/docs/data-modeling/drivers.mdx 的 "Supported Drivers" 表把别名列为 OS_DATABASE_DRIVER 的合法值(postgres | postgresql | pgmysql | mysql2sqlite | sql、…)。

后果:OS_DATABASE_DRIVER=pg(或 mysql2 / mongo / libsql / wasm-sqlite / mingo / …)在 os start 下正常,在 os migrate 下被拒。改前这条路是静默 SQLite,所以 #6344 是净改善;但同一个环境变量仍有两种答案。

复现:

OS_DATABASE_DRIVER=pg OS_DATABASE_URL=postgres://u:p@localhost:5432/db os start   #
OS_DATABASE_DRIVER=pg OS_DATABASE_URL=postgres://u:p@localhost:5432/db os migrate plan   # 拒(改前:静默 SQLite)

值得注意:仓内已经有一份唯一别名表 —— packages/spec/src/data/driver/config-registry.zod.tsDRIVER_ID_ALIASES / resolveDriverId(共享工厂已经在用它,注释里明确写着「两张表意味着选 driver 的 id 与选 config 契约的 id 可能不一致」)。但它的规范 id 是 mongo(不是 standalone 的 mongodb),且不含 turso/libsql(那不是 builtin driver),所以直接复用不是机械替换,需要裁决。

未裁选项:

  • A standalone enum 收下同一批别名(与 CLI 对齐,词表集中一处);
  • B 反过来把 CLI 收窄到规范拼写,拒绝时给 rename hint(contract-first 口味,但会打断现有 --database-driver pg 用法);
  • C 两侧都改读 spec 的 resolveDriverId,并先把 mongodb/turso 的口径补进那张表。

倾向 C(唯一词表,选 driver 与选 config 契约同一个集合)或 A;但这是公开配置面的取舍,应由维护者裁。

(2) 显式选了「非文件」driver 却没给 URL —— 两侧都不好,方式不同

  • CLI:resolveStorageDefinition('postgres', { databaseUrl: undefined }) 产出 config: { url: undefined },pg 于是用它自己的默认值连 localhost:5432 —— 连到一个操作者从没点名的地方;
  • standalone stack:resolveDatabaseUrl() 兜底成 file:…/standalone.db,于是 mysql/postgres/mongodb 拿到一个 file: 开头的 DSN,失败在 driver 里,消息与成因隔了两层。

对照:turso 在 CLI 侧已经有 typed UnsupportedDriverError,话说得很到位 ——「选了 turso 却没给 URL,libSQL 没有可猜的默认;退回 SQLite 会静默忽略你要的 driver」。同一句话对 mysql / postgres / mongodb 一字不改都成立。

建议:把那条 typed 拒绝推广到所有「无本地默认」的 kind(两侧),而不是各自兜一个错误的默认。

(3) --database-driver 的 help 文案漏项

packages/cli/src/commands/start.ts:109packages/cli/src/commands/dev.ts:102 的描述都是
Force driver kind: sqlite | turso | postgres | mongodb | memory,漏了 mysqlsqlite-wasm —— 两者都能用;content/docs/deployment/cli.mdx:134 / :323 的表同样漏。而 content/docs/deployment/environment-variables.mdx:52 列的是全集(含 mysql)。三份清单,三种答案。

若 (1) 收敛到唯一词表,这条应当顺带由那份词表推导出来,而不是再手写一遍。


未认领。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions