☰
使用 TypeORM 连接 Dolt SQL Server:面向 MySQL 兼容 ORM 的冒烟测试实战指南
2026/10/1 2:24:56 网站建设 项目流程
  • 数据库
  • 关系型数据库
  • 后端
  • CLI

【免费下载链接】dolt

Dolt – Git for Data

项目地址:https://gitcode.com/GitHub_Trending/do/dolt
点击查看免费下载

Dolt 是一款“Git for Data”数据库,同时提供与 MySQL 兼容的 SQL 服务,因此理论上任何支持 MySQL 协议的 ORM 都能直接接入。本文以仓库中的 TypeORM 冒烟测试项目为核心,完整讲解如何用 TypeORM 连接并操作 Dolt SQL Server——包括项目初始化方式、数据源配置、实体定义、写入/读取验证流程,以及它在整个 ORM 兼容性测试体系中的运行位置。读完本文,你将掌握将 TypeORM 应用接入 Dolt、通过环境变量覆盖连接参数、并复用冒烟测试验证兼容性的完整方法。

一、项目背景:Dolt 的 ORM 兼容性测试体系

Dolt 通过dolt sql-server提供 MySQL 兼容协议的服务端能力,因此生态中大量基于 MySQL 的 ORM 都有望直接使用。为验证这一兼容性,仓库在 integration-tests/orm-tests 目录下维护了一套针对多种 ORM 的测试:

  • 理想情况下复用 ORM 官方自带的 MySQL 测试套件;
  • 在暂时无法完整跑通官方套件时,先用一个**小型冒烟测试(smoke test)**快速获得初始覆盖。

TypeORM 冒烟测试正是这套体系中的一员。在 orm-tests.bats 中可以找到它的驱动测试用例:

# TypeORM is an ORM for Node/TypeScript applications. This is a simple smoke test to make sure # Dolt can support the most basic TypeORM operations. @test "TypeORM smoke test" { cd $BATS_TEST_DIRNAME/typeorm npm install npm start }

该用例会进入typeorm目录执行npm install与npm start,直接复用本项目验证“TypeORM 最基本的读写操作能否在 Dolt 上正常工作”。

二、项目结构与初始化方式

TypeORM 冒烟测试项目位于 integration-tests/orm-tests/typeorm,其目录结构如下:

typeorm/ ├── README.md # 项目说明(本文主题文档) ├── package.json # 依赖与 npm scripts ├── tsconfig.json # TypeScript 编译配置 └── src/ ├──>typeorm init --name typeorm-smoketest --database mysql

即通过 TypeORM CLI 以mysql数据库类型为模板生成的骨架,再针对 Dolt 场景做了最小化定制。

2.1 依赖与脚本(package.json)

package.json 中声明的关键依赖:

依赖版本作用
typeorm^0.3.10ORM 核心库
reflect-metadata^0.1.13装饰器元数据反射支持(TypeORM 运行必需)
mysql^2.14.1Node.js 的 MySQL 驱动,负责底层协议通信
ts-node(dev)^10.7.0直接运行 TypeScript 源码
typescript(dev)^4.5.2类型检查与编译
@types/node(dev)^16.11.10Node.js 类型定义

两个 npm scripts 是运行入口:

"scripts": { "start": "ts-node src/index.ts", "typeorm": "typeorm-ts-node-commonjs" }
  • npm start:直接用ts-node执行src/index.ts,无需先编译;
  • npm run typeorm:暴露 TypeORM CLI(commonjs 变体),便于后续执行迁移等管理命令。

2.2 TypeScript 编译配置(tsconfig.json)

tsconfig.json 中有两个对 TypeORM 至关重要的选项:

"emitDecoratorMetadata": true, "experimentalDecorators": true

TypeORM 实体依赖@Entity、@Column等装饰器,experimentalDecorators启用装饰器语法,emitDecoratorMetadata让编译器输出设计时类型元数据——没有这两项,TypeORM 将无法自动推断实体列类型。

三、连接配置:如何指向 Dolt SQL Server

数据库设置全部集中在 src/data-source.ts,默认配置针对的是:

  • 协议/驱动类型:mysql
  • 主机:localhost
  • 端口:3306(Dolt 默认端口)
  • 用户:root
  • 密码:空
  • 数据库:dolt

这与 README 的描述一致:连接“hit a Dolt sql-server on the default port, for the dolt root, with no password, for the database named 'dolt'”。

3.1 环境变量优先的连接参数

源码用process.env让所有连接参数均可被环境变量覆盖,且带合理默认值:

const host = process.env.DB_HOST ?? "localhost" const portValue = process.env.DB_PORT ?? "" const parsedPort = Number.parseInt(portValue, 10) const port = Number.isNaN(parsedPort) ? 3306 : parsedPort const username = process.env.DB_USER ?? "root" const password = process.env.DB_PASSWORD ?? "" const database = process.env.DB_NAME ?? "dolt"
环境变量默认值说明
DB_HOSTlocalhostDolt SQL Server 所在主机
DB_PORT3306端口;解析失败(NaN)时回退到 3306
DB_USERrootDolt 登录用户
DB_PASSWORD空Dolt 登录密码
DB_NAMEdolt目标数据库名

这个设计让同一份代码既能本地直连默认配置,也能被测试框架注入随机端口与仓库名。在 orm-tests.bats 中,测试正是这样覆盖这些变量的:

PORT=$(definePORT) start_sql_server_with_args_no_port --host 0.0.0.0 --port="$PORT" --loglevel=debug export DB_HOST="127.0.0.1" export DB_PORT="$PORT" export DB_USER="root" export DB_PASSWORD="" export DB_NAME="$REPO_NAME"

即:先由 bats 辅助函数在随机端口启动dolt sql-server(可参考 query-server-common.bash 中的start_sql_server_with_args_no_port实现),再以环境变量把 TypeORM 指向该实例。

3.2 DataSource 装配

export const AppDataSource = new DataSource({ type: "mysql", host: host, port: port, username: username, password: password, database: database, synchronize: true, logging: false, entities: [User], migrations: [], subscribers: [], })

关键选项解读:

  • synchronize: true:启动时自动根据实体定义建表/同步表结构。冒烟测试借此免去手动建表步骤——首次连接 Dolt 时,TypeORM 会自动执行CREATE TABLE。生产环境一般应关闭并改用迁移;
  • logging: false:关闭 SQL 日志,保持输出简洁;
  • entities: [User]:显式注册User实体;
  • migrations/subscribers:冒烟测试不需要,保持空数组。

四、实体定义:User

src/entity/User.ts 定义了一个标准的自增主键实体:

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm" @Entity() export class User { @PrimaryGeneratedColumn() id: number @Column() firstName: string @Column() lastName: string @Column() age: number }
  • @Entity()将该类映射为数据库表user;
  • @PrimaryGeneratedColumn()生成自增主键id(Dolt 的 MySQL 兼容层支持AUTO_INCREMENT,这正是 auto_increment.bats 等测试覆盖的能力范围);
  • 三个@Column()分别映射firstName、lastName、age列。

五、冒烟流程:插入 → 加载 → 验证

主入口 src/index.ts 完整实现了 README 描述的行为:插入一条新记录、加载回来、打印成功并以退出码 0 结束;任何异常则打印错误并以非零退出码结束。

import { AppDataSource } from "./data-source" import { User } from "./entity/User" AppDataSource.initialize().then(async () => { console.log("Inserting a new user into the database...") const user = new User() user.firstName = "Timber" user.lastName = "Saw" user.age = 25 await AppDataSource.manager.save(user) console.log("Saved a new user with id: " + user.id) console.log("Loading users from the database...") const users = await AppDataSource.manager.find(User) console.log("Loaded users: ", users) console.log("Smoke test passed!") process.exit(0) }).catch(error => { console.log(error) console.log("Smoke test failed!") process.exit(1) })

执行链路分四步:

  1. AppDataSource.initialize():建立与 Dolt SQL Server 的连接池,并因synchronize: true自动同步表结构;
  2. 写入:构造User实例(firstName=Timber、lastName=Saw、age=25),manager.save(user)执行 INSERT,随后打印自增生成的user.id;
  3. 读取:manager.find(User)查询全表并打印结果,验证写入的数据能被读回;
  4. 判定:成功后打印Smoke test passed!并process.exit(0);.catch中打印错误与Smoke test failed!并process.exit(1)。

退出码是测试集成的重要约定:bats 断言依赖进程退出码 0/非 0 来判断通过/失败。

六、运行方式

6.1 前提:启动 Dolt SQL Server

在仓库根目录(含dolt/的工作区)先初始化并启动服务:

dolt init dolt sql-server --host 0.0.0.0 --port 3306

若想启用指定数据库,可先创建:

dolt sql -q "create database dolt"

启动后即为 TypeORM 提供一个位于默认端口 3306、用户root、无密码、数据库名为dolt的 MySQL 兼容服务端点。

6.2 安装依赖并运行冒烟测试

cd integration-tests/orm-tests/typeorm npm install npm start
  • npm install安装typeorm、reflect-metadata、mysql驱动及开发期工具;
  • npm start执行ts-node src/index.ts,输出依次为:
Inserting a new user into the database... Saved a new user with id: 1 Loading users from the database... Loaded users: [ User { id: 1, firstName: 'Timber', lastName: 'Saw', age: 25 } ] Smoke test passed!

6.3 非默认端口/远端部署场景

如果 Dolt SQL Server 不在默认端口或本机,直接用环境变量覆盖:

DB_HOST=127.0.0.1 DB_PORT=3307 DB_NAME=myrepo npm start

该机制与 bats 测试的做法完全一致,也便于在 CI 中复用同一套项目代码。

七、在 Docker 中运行整个 ORM 测试套件

TypeORM 冒烟测试也可作为 ORM 测试镜像 的一部分整体运行。从仓库根目录执行:

docker build -t orm-tests -f dolt/integration-tests/orm-tests/Dockerfile . docker run orm-tests:latest

该 Dockerfile 采用多阶段构建(参考 integration-tests/orm-tests/README.md):

  • golang_cgo→dolt_build阶段:在 Alpine 上编译dolt二进制(go build -tags icu_static -o /build/bin/dolt ./cmd/dolt),且独立成层,ORM 代码变更时可复用缓存、加速首次镜像构建;
  • runtime阶段:基于 Ubuntu 22.04,安装 Node.js 22、Python、JDK 17、Maven、bats 以及 mysql 客户端等,把dolt二进制与integration-tests/orm-tests一并拷入镜像;
  • 入口脚本 orm-tests-entrypoint.sh 先写入全局 dolt 配置(关闭 metrics、设置测试用户),再执行bats /orm-tests/orm-tests.bats --print-output-on-failure,其中就包含上述 TypeORM 冒烟测试。

若需把本地修改过的go-mysql-server等依赖编进镜像,可按 orm-tests/Dockerfile 中的注释在dolt_build阶段加入对应COPY,并同步在本地dolt/go/go.mod添加replace指令。

八、小结:这套冒烟测试验证了什么

从实现角度看,TypeORM 冒烟测试实际验证了 Dolt SQL Server 在以下维度的 MySQL 兼容性:

  1. 协议接入:mysqlNode 驱动能否成功握手并执行查询(data-source.ts);
  2. DDL 同步:synchronize: true下 TypeORM 自动生成并执行建表语句(映射到 User.ts 实体);
  3. 基础 CRUD:save(INSERT + 自增主键)与find(SELECT)能否正确读写数据(index.ts);
  4. 进程退出码契约:成功/失败分别以 0/非 0 退出,供 orm-tests.bats 无缝集成。

因此,本文给出的配置模板(type: "mysql"+ 环境变量覆盖 +synchronize)可以直接迁移到你自己的 TypeORM + Dolt 项目中——只需把User实体替换为业务实体,并按需关闭synchronize、改用 TypeORM migration 管理表结构即可。

  • 数据库
  • 关系型数据库
  • 后端
  • CLI

【免费下载链接】dolt

Dolt – Git for Data

项目地址:https://gitcode.com/GitHub_Trending/do/dolt
点击查看免费下载

相关推荐

上一篇:iOS设备激活锁绕过实战指南:Applera1n工具深度应用解析
下一篇:YouTube.js 解析器节点深度解析:AccountSectionList 账户分段列表类

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询