Bladeren bron

docs: JOIN 移入支持清单 + GORM 接入章节 (gormvrtx)

yl32940 3 weken geleden
bovenliggende
commit
c2cf123995
2 gewijzigde bestanden met toevoegingen van 44 en 4 verwijderingen
  1. 3 3
      README.md
  2. 41 1
      docs/SQL_DRIVER_GUIDE.md

+ 3 - 3
README.md

@@ -54,7 +54,7 @@ TsDB2 是一个**纯 Go** 的嵌入式数据库,同时服务两类场景:
   - `ORDER BY + LIMIT` 流式 top-k:只保留 limit+offset 行的小顶堆,内存 O(k) 且免全量排序,稳定性与全排序一致。
   - core 层:条件构造器 `Eq/Gt/Ge/Lt/Le/Like/ILike/In` 与 `And/Or/Not` 任意组合;`Query` 另支持 `Select/FindOne/Sum/Max/Min`(分组聚合 `GroupBy`/`Having` 暂未支持)。
 - **事务**:`BeginTransaction()` / `Commit()` / `Rollback()`;提交走整页 WAL + fsync,回滚通过丢弃缓存页立即生效,BEGIN 自动收敛未落盘的修改。
-- **database/sql 驱动**:`import _ "DB/driver"` 后 `sql.Open("vrtx", 路径)` 即可让 xorm / sqlx / 自研 ORM 直连(内置 ORM 子集 SQL 翻译器,零依赖);JOIN / 子查询 / GROUP BY 等明确报错不静默,见 [docs/SQL_DRIVER_GUIDE.md](docs/SQL_DRIVER_GUIDE.md)。
+- **database/sql 驱动**:`import _ "DB/driver"` 后 `sql.Open("vrtx", 路径)` 即可让 xorm / sqlx / 自研 ORM 直连(内置 ORM 子集 SQL 翻译器,零依赖);支持单表全语句 + INNER/LEFT 等值 JOIN;子查询 / GROUP BY 等明确报错不静默,见 [docs/SQL_DRIVER_GUIDE.md](docs/SQL_DRIVER_GUIDE.md)。配套 **`gormvrtx/` GORM Dialector**(独立子模块):GORM 的 AutoMigrate / CRUD / Joins / 事务直接可用。
 - **提交策略可调**:防抖自动提交、脏页阈值、预设(`batch` / `online` / `safe` / `ultra-safe`),默认无需手动 `Commit`。
 - **存储管理**:真 LRU BufferPool(读/写命中都刷新热度,容量满淘汰最久未用的干净页;**读未命中也进缓存**,重复扫描/点查不再每次走磁盘)、空闲页链表回收(`DropTable` 后页可复用,页删空延迟到提交成功后还链)、动态字段走堆页 + 引用计数自动回收。
 - **可视化分析器**:`analyzer/` 是独立的网页工具,可打开 `.db` 文件查看页布局、表 / 索引结构、堆链、空闲链,并做全库一致性审计。
@@ -551,8 +551,8 @@ row := db.QueryRow(`SELECT name, age FROM users WHERE id = ?`, 1)
 =NULL)、UPDATE、DELETE、CREATE TABLE(类型映射 + 主键 / 唯一 / 普通索引)、
 CREATE [UNIQUE] INDEX、DROP TABLE、事务。
 
-不支持(明确报错,不静默):JOIN、子查询、GROUP BY、ALTER TABLE、复合索引 /
-复合主键、函数表达式、`BETWEEN` 等;CREATE TABLE 的表选项(`ENGINE=`/`CHARSET=` 等)解析后忽略。
+不支持(明确报错,不静默):子查询、GROUP BY、ALTER TABLE、复合索引 /
+复合主键、函数表达式、`BETWEEN`、RIGHT/FULL JOIN 与非等值连接等;CREATE TABLE 的表选项(`ENGINE=`/`CHARSET=` 等)解析后忽略。
 
 语句清单、类型映射表、NULL / 时间语义、连接与并发约定见
 [`docs/SQL_DRIVER_GUIDE.md`](docs/SQL_DRIVER_GUIDE.md);可运行示例

+ 41 - 1
docs/SQL_DRIVER_GUIDE.md

@@ -36,6 +36,22 @@ SELECT ... FROM t WHERE 条件 ORDER BY 列 [ASC|DESC], ... LIMIT n [OFFSET m]
 SELECT COUNT(*) | COUNT(列) | SUM(列) | MIN(列) | MAX(列) | AVG(列) FROM t [WHERE ...]
 ```
 
+**JOIN**(INNER / LEFT [OUTER],等值条件,链式多表):
+
+```
+SELECT 列清单 FROM 表1 [AS] a
+  JOIN 表2 [AS] b ON a.x = b.y            -- INNER JOIN 可省 INNER
+  LEFT JOIN 表3 [AS] c ON b.m = c.n
+  [WHERE 条件] [ORDER BY ...] [LIMIT n [OFFSET m]]
+
+列清单: * | t.* | 列名 | t.列名           -- WHERE/ORDER BY 同样支持限定名
+```
+
+执行策略:左表全扫描(本表条件下推索引)→ 逐行取 ON 左列值对右表做
+`Eq` 索引点查的嵌套循环;INNER 无匹配丢行、LEFT 补全 NULL;跨表条件
+(列比较 / 跨表 OR)作残余谓词在组合行上过滤;投影后内存排序再 LIMIT。
+非等值 ON / RIGHT / FULL JOIN 明确报错;JOIN+聚合暂不支持。
+
 WHERE 条件族(`?` 为参数占位符,字面量同样可用):
 
 | 语法 | 说明 |
@@ -104,7 +120,7 @@ DROP TABLE [IF EXISTS] t
 
 | 类别 | 内容 |
 |------|------|
-| 多表 | JOIN(任何形式) |
+| 多表 | 除 INNER/LEFT 等值 JOIN 外的连接形式(RIGHT/FULL JOIN、笛卡尔积) |
 | 嵌套 | 子查询、`INSERT ... SELECT` |
 | 分组 | `GROUP BY`、`HAVING`、`DISTINCT` |
 | 函数 | WHERE/SELECT 中的任意函数表达式(`UPPER`/`CASE WHEN` 等) |
@@ -142,6 +158,30 @@ DROP TABLE [IF EXISTS] t
 - 时序表(行存储为时序索引)同样可经驱动写入:主键列声明 `DATETIME`
   且按时间非递减写入即可。
 
+## GORM 接入(gormvrtx 模块)
+
+仓库提供官方风格的 GORM Dialector:`gormvrtx/` 是独立子模块(自带
+`go.mod`,主仓库保持零依赖):
+
+```go
+import (
+	"gorm.io/gorm"
+	vrtx "git.ycl.pub/yl32940/TsDB2/gormvrtx"
+)
+
+db, err := gorm.Open(vrtx.Open("/path/to/data.db"), &gorm.Config{})
+```
+
+- **CRUD / 查询 / 事务 / Preload**:走 GORM 生成 SQL → vrtx 驱动执行,
+  `Joins()`(等值)同样可用。
+- **AutoMigrate 真正可用**:`gormvrtx` 实现了 GORM 的 Migrator 接口,
+  schema 自省与变更**直连引擎元数据 API**(不经 SQL):建表 / 加列 /
+  删列 / 唯一与普通索引的自动比对与补齐都能跑通(`AlterColumn` 改类型、
+  重命名等少数操作返回"不支持")。
+- 整型主键零值自动预分配并回填对象(对齐自增语义)。
+
+演示:`cd gormvrtx/demo && go run main.go`。
+
 ## 测试与演示
 
 - 驱动测试:`go test ./DB/driver/`(CRUD/查询全链路、事务、不支持语法、