发现于 #5820 的实施(PR 见下方 linked)。落点同为 packages/runtime/src/standalone-stack.ts,但与 #5820 的 libsql 面不相交(另一个 scheme + 另一条 explicit-driver 路径),故另开、未认领。
现状(origin/main@01faeb13a 实读)
(a) mysql:// 只有 CLI 认,standalone stack 不认 —— 与 #5820 完全同形
packages/cli/src/utils/storage-driver.ts inferDriverTypeFromUrl():if (/^mysql2?:\/\//i.test(u)) return 'mysql';,resolveStorageDefinition() 有 mysql 臂,产出 driverId: 'mysql';
packages/services/service-datasource/src/default-datasource-driver-factory.ts 有 kind === 'mysql' 臂(SqlDriver + mysql2),即共享工厂本来就能造;
packages/runtime/src/standalone-stack.ts detectDriverFromUrl() 无 mysql 臂 ⇒ mysql://… 落到末尾 throw Unsupported database URL scheme。
于是同一个 OS_DATABASE_URL=mysql://…:os start 正常启动,os migrate(经 createStandaloneStack / resolveStandaloneDatabase)硬失败 —— 与 #5820 一字不差的分叉,只是换了 scheme。修法比 #5820 更便宜:共享工厂已支持,只需 detect 一臂 + 一个 { driver: 'mysql', config: { url } } 定义,不牵扯任何可选包。
(b) OS_DATABASE_DRIVER 的值从未被校验,未知值静默变成 SQLite
resolveStandaloneDatabase():
const explicitDriver = cfg.databaseDriver
?? (process.env.OS_DATABASE_DRIVER?.trim() as ResolvedDriverKind | undefined);
as 是纯断言,没有任何 runtime 校验;createStandaloneStack() 的分派链末尾是 else { /* sqlite */ }。后果:
OS_DATABASE_DRIVER=mysql(CLI 公开宣传的值)且未设 URL ⇒ 默认 file:…standalone.db ⇒ 静默建一个 SQLite 库,操作者以为在连 MySQL;
- 拼写错误(
mysq1 / postgress)同样静默落 SQLite;
- 设了 URL 时反而"响亮"但误导:
sqliteFilenameFromUrl() 报 "sqlite driver was selected but the URL does not look like a file path",而操作者根本没选 sqlite。
这正是 #3276 那一类("宣传了某 driver kind,实际静默换成另一个引擎")。注意 cfg.databaseDriver 走 zod enum,是响亮拒绝的;只有 env 那一路是裸断言,两条口径不一致。
建议处置(未裁,留给 PM)
detectDriverFromUrl() 补 mysql/mysql2 臂 + createStandaloneStack() 补 { driver: 'mysql', config: { url } } 定义(共享工厂已能造),并把 mysql 补进 databaseDriver enum 与 Supported schemes: 列表;
- explicit driver 走一次真校验(把 env 值按同一个 zod enum 解析),未知值响亮拒绝并列出合法值,而不是落到 sqlite 的
else。二者建议同批,否则补了 (1) 仍留着 (2) 的静默面。
⚠️ 未认领。PR #5820 刻意没有顺手改:它的裁决面是 libsql 一条 scheme,mysql 与 explicit-driver 校验是独立的行为变更,应各自被裁。
发现于 #5820 的实施(PR 见下方 linked)。落点同为
packages/runtime/src/standalone-stack.ts,但与 #5820 的 libsql 面不相交(另一个 scheme + 另一条 explicit-driver 路径),故另开、未认领。现状(origin/main@01faeb13a 实读)
(a)
mysql://只有 CLI 认,standalone stack 不认 —— 与 #5820 完全同形packages/cli/src/utils/storage-driver.tsinferDriverTypeFromUrl():if (/^mysql2?:\/\//i.test(u)) return 'mysql';,resolveStorageDefinition()有mysql臂,产出driverId: 'mysql';packages/services/service-datasource/src/default-datasource-driver-factory.ts有kind === 'mysql'臂(SqlDriver + mysql2),即共享工厂本来就能造;packages/runtime/src/standalone-stack.tsdetectDriverFromUrl()无 mysql 臂 ⇒mysql://…落到末尾 throwUnsupported database URL scheme。于是同一个
OS_DATABASE_URL=mysql://…:os start正常启动,os migrate(经createStandaloneStack/resolveStandaloneDatabase)硬失败 —— 与 #5820 一字不差的分叉,只是换了 scheme。修法比 #5820 更便宜:共享工厂已支持,只需 detect 一臂 + 一个{ driver: 'mysql', config: { url } }定义,不牵扯任何可选包。(b)
OS_DATABASE_DRIVER的值从未被校验,未知值静默变成 SQLiteresolveStandaloneDatabase():as是纯断言,没有任何 runtime 校验;createStandaloneStack()的分派链末尾是else { /* sqlite */ }。后果:OS_DATABASE_DRIVER=mysql(CLI 公开宣传的值)且未设 URL ⇒ 默认file:…standalone.db⇒ 静默建一个 SQLite 库,操作者以为在连 MySQL;mysq1/postgress)同样静默落 SQLite;sqliteFilenameFromUrl()报 "sqlite driver was selected but the URL does not look like a file path",而操作者根本没选 sqlite。这正是 #3276 那一类("宣传了某 driver kind,实际静默换成另一个引擎")。注意
cfg.databaseDriver走 zod enum,是响亮拒绝的;只有 env 那一路是裸断言,两条口径不一致。建议处置(未裁,留给 PM)
detectDriverFromUrl()补mysql/mysql2臂 +createStandaloneStack()补{ driver: 'mysql', config: { url } }定义(共享工厂已能造),并把mysql补进databaseDriverenum 与Supported schemes:列表;else。二者建议同批,否则补了 (1) 仍留着 (2) 的静默面。