TypeORM plugin for Egg.js.
$ npm install -S @hackycy/egg-typeorm typeorm mysql
// {app_root}/config/plugin.ts
const plugin: EggPlugin = {
typeorm: {
enable: true,
package: '@hackycy/egg-typeorm',
},
}
在项目根目录添加ormconfig.{js|json|yaml|yml}
文件(配置支持后缀中的任意一种即可)
ormconfig.js
// 单数据库连接
module.exports = {
entitiesDir: "app/entity/db1"
};
// 或者多数据库连接
module.exports = [
{
name: 'default',
entitiesDir: "app/entity/db1"
},
{
name: 'db2',
entitiesDir: "app/entity/db2"
}
];
ormconfig.json
// 单数据库连接
{
"entitiesDir": "app/entity/db2",
}
// 或者多数据库连接
[
{
"name": "default",
"entitiesDir": "app/entity/db1"
},
{
"name": "db2",
"entitiesDir": "app/entity/db2"
}
]
ormconfig.yaml或ormconfig.yml
# yaml || yml
default: //默认连接
entitiesDir: app/entity/db1
db2: //或者多数据库连接时配置
entitiesDir: app/entity/db2
entitiesDir表示数据库的实体文件存放的路径;
js、json、yaml、yml插件会按照该顺序查找对应ormconfig后缀的文件,找到则不会再使用其它后缀的配置。
注意这里是有优先级的。
相当于connection-options中entities配置项为
['app/entity/**/*.{js,ts}']
,只需配置目录
// {app_root}/config/config.default.ts
config.typeorm = {
client: {
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '123456',
database: 'test',
synchronize: true,
logging: false,
}
}
// {app_root}/config/config.default.ts
config.typeorm = {
clients: [{
name: "default",
type: "mysql",
host: "localhost",
port: 3306,
username: "root",
password: "admin",
database: "db1",
synchronize: true,
}, {
name: "model2",
type: "mysql",
host: "localhost",
port: 3306,
username: "root",
password: "admin",
database: "db2",
synchronize: true,
}]
}
注意:如果定义了clients,插件会直接忽略掉client的配置,只能二选一配置
├── controller
│ └── home.ts
├─ entity
└─sys
└── user.ts
// app/entity/sys/user.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'
@Entity()
class User {
@PrimaryGeneratedColumn()
id: number
@Column()
name: string
}
// 注意:这里必须要以 default 导出, 否则插件无法查找到定义的类文件
export default User
// in controller
export default class UserController extends Controller {
public async index() {
const { ctx } = this
// 单数据库
// app/entity/sys/user.ts => ctx.repo.sys.User
// app/entity/user.ts => ctx.repo.User
// app/entity/admin/sys/user_role.ys => ctx.repo.admin.sys.UserRole
// 多数据库 例如获取db1
// ctx.repo['db1'].user,转换方式同上
ctx.body = await ctx.repo.sys.User.find()
}
}
所有实体会加载在
ctx.entity
中, 所有仓库会加载到ctx.repo
;多数据库时加载在对应的
ctx.entity[connectName]
与ctx.repo[connectionName]
上;注意:使用name为default会直接挂载,不需要指定connectName
详细可以查看项目下typings文件夹下的
typeorm.d.ts
// in controller
export default class UserController extends Controller {
public async index() {
const { ctx } = this
const firstUser = await ctx.repo.User.createQueryBuilder('user')
.where('user.id = :id', { id: 1 })
.getOne()
ctx.body = firstUser
}
}
具体使用可查看exmaple使用案例, 实战示例可参考:sf-egg-admin
插件默认自定义了一个基于Egg的Logger模块实现的日志记录器。如果配置中没有进行配置connection-options
中的logger
,则会默认使用插件提供日志记录器。如果想要更换或者使用原来TypeOrm提供的只需要配置对应字段即可。
常规开发流程可能不仅仅只有prod才是预设的生产环境,可通过该配置来自定义环境来适应自己的开发流程。
用于区分开发环境及生产环境,开发环境使用的
ts-node
运行,生产环境应需要把TS编译成JS再运行。
config.typeorm = {
prodEnv: [ 'prod', 'stagging' ]
}
// or
config.typeorm = {
prodEnv: 'prod'
}
获取getConnection
this.ctx.ormConnection || this.ctx.getOrmConnection('connectionName')
获取getManager
this.ctx.ormManager || this.ctx.getOrmManager('connectionName')
请提出issues