-
Notifications
You must be signed in to change notification settings - Fork 5
feat: 双数据库支持 — SQLite + PostgreSQL 并存方案 #487
Copy link
Copy link
Closed
Labels
P1Critical: production outage, data loss, securityCritical: production outage, data loss, securityarchitectureDomain: design patterns, coupling, separation of concernsDomain: design patterns, coupling, separation of concernsarea/sessionScope: session manager, state machine, store, poolScope: session manager, state machine, store, poolenhancementFeature: new capabilities or improvementsFeature: new capabilities or improvements
Metadata
Metadata
Assignees
Labels
P1Critical: production outage, data loss, securityCritical: production outage, data loss, securityarchitectureDomain: design patterns, coupling, separation of concernsDomain: design patterns, coupling, separation of concernsarea/sessionScope: session manager, state machine, store, poolScope: session manager, state machine, store, poolenhancementFeature: new capabilities or improvementsFeature: new capabilities or improvements
概述
在保持现有 SQLite 生产级支持的前提下,新增 PostgreSQL 作为可选数据库后端。通过
dbutil.Dialect抽象层隔离 SQL 方言差异,用户通过一个配置开关(db.driver: postgres)即可切换,无需修改业务代码。📄 完整规格:docs/specs/Dual-Database-Support-Spec.md
背景
WriteMu串行化json_extract()有限jsonbGIN 索引现状
modernc.org/sqlite(internal/sqlutil/driver.go)*sql.DB,5 个消费者共享DialectSQLite3WriteMu全局互斥锁(SQLite 专有).sql文件pgstore.go不存在,无任何 PG 驱动导入已有可复用接口
session.Store、cron.Store、eventstore.EventStore+EventTx+TurnQuerier接口无需改动。缺失抽象
ChatAccessStoreapiKeyUserStoreAdmin.Deps.DB*sql.DBSQL 方言差异(核心挑战)
?$1,$2`col`"col"AUTOINCREMENTBIGSERIALINTEGER(0/1)BOOLEANON CONFLICT ... excluded.colON CONFLICT ... EXCLUDED.coljson_extract()->>操作符pq.Error.Code == "23505"架构设计
核心抽象
internal/dbutil/包:参考项目:Grafana / Gitea / Memos / Focalboard / autobrr / Syncthing
实施计划(9 个 Phase)
ChatAccessStorer+APIKeyUserStorer接口internal/dbutil/包(Dialect + Rebind + DB 包装器)DBConfig(新增 Driver + PostgresConfig 字段)sqlutil— 移除 SQLite 硬编码预估: ~2,430 行新增代码,~295 行修改,约 22 个文件变更。
验收标准
db.driver=sqlite时,行为完全不变(回归测试通过)db.driver=postgres时,Gateway 启动、创建连接、运行迁移boolToInt()/isSQLiteUnique()等 SQLite 专有辅助函数被 Dialect 方法替代