概述
TypeORM 提供了功能完善的 CLI 工具,可以通过配置文件(data-source.ts)来管理数据库的 Schema 同步、迁移等操作,而不必每次都通过 forRootAsync + 应用启动来初始化数据库。
本节从 Docker Compose 创建第二个 MySQL 实例开始,演示完整的 TypeORM CLI 配置流程。
Docker Compose 创建第二个 MySQL 实例
在 docker-compose.mysql.yml 中新增 db1 服务:
# docker-compose.mysql.yml
services:
db:
image: mysql:8
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: test_db
db1:
image: mysql:8
ports:
- "3307:3306" # 宿主机映射端口 3307
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: test_db
yaml
启动命令:
docker compose -f docker-compose.mysql.yml up -d
bash
使用 Adminer 或其他数据库管理工具连接 db1,服务名 db1(同一 Docker 网络内)或 localhost:3307(从宿主机访问)。
TypeORM 配置文件 data-source.ts
TypeORM CLI 支持 .js、.ts 等多种后缀的配置文件,建议使用 .ts 格式。在项目根目录创建 data-source.ts:
读取 .env 配置的辅助函数
// data-source.ts
import { DataSource, DataSourceOptions } from 'typeorm';
import * as dotenv from 'dotenv';
import * as fs from 'fs';
function getEnv(envString: string): Record<string, string | unknown> {
if (fs.existsSync(envString)) {
return dotenv.parse(fs.readFileSync(envString));
}
return {};
}
function buildConnectionOptions(): DataSourceOptions {
// 读取默认配置
const defaultConfig = getEnv('.env');
// 读取环境特定配置
const envConfig = getEnv(`.env.${process.env.NODE_ENV || 'development'}`);
// 合并配置,环境特定文件覆盖默认配置
const config = { ...defaultConfig, ...envConfig };
return {
type: (config.DB_TYPE as any) || 'mysql',
host: config.DB_HOST as string,
port: parseInt(config.DB_PORT as string, 10) || 3306,
username: config.DB_USERNAME as string,
password: config.DB_PASSWORD as string,
database: config.DB_DATABASE as string,
synchronize: config.DB_SYNC === 'true',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
} as DataSourceOptions;
}
export default new DataSource(buildConnectionOptions());
typescript
配置要点
getEnv()函数兼容.env和.env.{NODE_ENV}两个文件的读取与合并entities路径使用 glob 匹配当前目录下所有.entity.ts或.entity.js文件synchronize通过.env中的DB_SYNC字段控制
配置 package.json 脚本
在 package.json 中添加 TypeORM CLI 脚本:
{
"scripts": {
"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js --dataSource data-source.ts",
"typeorm:sync": "npm run typeorm schema:sync",
"typeorm:drop": "npm run typeorm schema:drop",
"typeorm:migration:generate": "npm run typeorm migration:generate -n",
"typeorm:migration:run": "npm run typeorm migration:run",
"typeorm:migration:revert": "npm run typeorm migration:revert"
}
}
json
使用 typeorm: 前缀将所有 TypeORM 相关命令归类管理,便于查找和维护。
执行 Schema 同步
pnpm run typeorm:sync
bash
执行后 CLI 会:
- 读取
data-source.ts中的配置 - 连接到指定数据库(如 3307 端口的 MySQL)
- 生成并执行 CREATE TABLE 等 SQL 语句
- 打印执行日志,包含所有执行的 SQL 查询
在数据库管理工具中刷新,即可看到 Entity 中定义的表结构已成功创建。
TypeORM CLI 常用命令
| 命令 | 说明 |
|---|---|
schema:sync | 将 Entity 定义同步到数据库(创建/更新表) |
schema:drop | 删除数据库中所有表 |
migration:generate -n <name> | 根据 Entity 变更生成迁移文件 |
migration:run | 执行所有未执行的迁移 |
migration:revert | 回退最近一次迁移 |
迁移(Migration)工作流
- 修改 Entity 定义
- 生成迁移文件:
pnpm typeorm:migration:generate InitSchema - 检查生成的迁移 SQL
- 执行迁移:
pnpm typeorm:migration:run - 如有问题回退:
pnpm typeorm:migration:revert
注意:
schema:sync和synchronize: true仅适用于开发环境,生产环境必须使用 Migration。
调试技巧
在 data-source.ts 中添加 console.log 打印合并后的配置信息,便于排查连接问题:
console.log('DB Config:', {
host: config.DB_HOST,
port: config.DB_PORT,
database: config.DB_DATABASE,
});
typescript
再次执行 pnpm run typeorm:sync 即可在终端看到实际使用的配置。
小结
- TypeORM CLI 通过
data-source.ts配置文件管理数据库操作,与forRootAsync互为补充 - 配置文件支持
.env读取和环境变量合并 - CLI 脚本使用
typeorm:前缀归类管理,命令清晰 - Schema 同步仅适用于开发环境,生产环境必须使用 Migration
↑