TypeORM连接数据库服务时是否可以不指定具体schema或数据库名称?
TypeORM无预指定Schema连接数据库解决方案
结论
TypeORM完全支持不提前指定业务Schema完成数据库服务连接,无需引入原生MySQL模块即可实现「先连接服务、再创建Schema」的需求。
实现方案
全版本兼容方案:借助系统默认库完成初始连接
MySQL服务初始化后默认自带mysql、information_schema等内置系统库,可先连接这类保证存在的库完成服务鉴权连接,之后再执行自定义Schema的创建操作,以当前主流的TypeORM 0.3.x版本为例,示例代码如下:
import { DataSource } from 'typeorm'; // 第一步:初始化连接,指向MySQL默认存在的系统库 const initialDataSource = new DataSource({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: '你的数据库密码', database: 'mysql', // 用默认系统库完成初始连接 entities: [], synchronize: false, }); await initialDataSource.initialize(); // 第二步:执行SQL创建自定义Schema await initialDataSource.query(`CREATE DATABASE IF NOT EXISTS 自定义库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;`); // 第三步:销毁初始连接,创建指向新库的正式业务连接 await initialDataSource.destroy(); const formalDataSource = new DataSource({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: '你的数据库密码', database: '自定义库名', entities: [/* 你的业务实体类 */], synchronize: true, // 按需配置 }); await formalDataSource.initialize();
如果使用TypeORM 0.2.x版本,只需把上述DataSource初始化逻辑替换为对应的createConnection方法即可,整体逻辑完全一致。
拓展用法
如果需要在同一个连接下切换使用不同的Schema,无需重建连接,直接执行USE语句即可:
await formalDataSource.query(`USE 目标库名;`);
注意事项
- 连接使用的数据库账号需要拥有
CREATE DATABASE权限,否则创建Schema时会抛出权限异常 - 如果使用其他关系型数据库(如PostgreSQL),逻辑完全一致,只需要替换初始连接的系统库名即可(PostgreSQL可使用默认的
postgres库作为初始连接库)
内容的提问来源于stack exchange,提问作者Manuel
相关产品推荐
相关产品推荐

