Files
navop/crates/db
胡飞 20050456ff fix(db): 低兼容级别 SQL Server 回退 ROW_NUMBER 分页(#471)
SQL Server 的 OFFSET … FETCH NEXT 要求数据库兼容级别 >= 110(SQL Server 2012)。
从旧版本还原的库即使运行在 2012+ 实例上,兼容级别仍可能停在 100,分页 SQL 报
「'OFFSET' 附近有语法错误」「FETCH 语句中选项 NEXT 的用法无效」,双击表预览
整页空白(#471)。

- DatabasePlugin 新增 supports_offset_fetch_pagination /
  build_legacy_paginated_query / paginated_query_for_connection:默认实现保持
  原有 OFFSET/FETCH 行为,只有方言需要时才覆盖;
- MSSQL 插件探测 sys.databases.compatibility_level:>= 110 继续用 OFFSET/FETCH,
  < 110 回退 ROW_NUMBER() OVER (ORDER BY …) 派生表分页(SQL Server 2005+ 可用),
  行号列作为隐藏列在展示前去掉;探测失败(权限、非 SQL Server 驱动)保持原行为;
- 表预览、CSV/JSON/XML/TXT/SQL 导出统一走按连接能力构建的分页查询;
- 补 MSSQL 分页单元测试:兼容级别阈值、探测 SQL 转义、回退 SQL 形态与 OFFSET /
  ROW_NUMBER 两条分流路径。

验证:RUSTFLAGS="-D warnings" cargo test -p db 全绿(1350 单元测试 + 集成测试);
RUSTFLAGS="-D warnings" cargo check --workspace --all-targets 通过。
2026-10-27 19:08:26 +08:00
..

Database Abstraction Layer

这个 crate 提供了一个统一的数据库抽象层,支持多种数据库类型。

架构

  • src/ - 顶层接口和公共类型

    • plugin.rs - DatabasePlugin trait 与数据库能力入口
    • plugin_manifest.rs - 数据库 UI manifest 合同,承载表单、能力位、动作元数据
    • manager.rs - 数据库管理器
    • connection.rs - 连接接口和连接池
    • executor.rs - SQL 执行器
    • runtime.rs - Tokio 运行时
    • types.rs - 公共类型定义
  • src/mysql/ - MySQL 实现

  • src/postgresql/ - PostgreSQL 实现

  • src/sqlite/ - SQLite 实现

crates/db 现在同时负责两层职责:

  • 数据库运行时能力:连接、元数据、SQL 构建、导入导出
  • 数据库 UI 合同:ui_manifest() 返回纯数据 manifest,供 db_view 做统一渲染

新增数据库插件时,除了实现 DatabasePlugin 的运行时方法,也应在插件侧返回 对应的 DatabaseUiManifest,并通过 resolve_reference_data() 提供动态下拉数据 (如 charset / collation / engines)。

使用示例

use db::{DbManager, DatabaseType, DbConnectionConfig};

let manager = DbManager::new();
let plugin = manager.get_plugin(&DatabaseType::MySQL)?;
let connection = plugin.create_connection(config).await?;