1.0.4 • Published 5 years ago
cl-mssql-model v1.0.4
Функции модуля
1. Получение модели базы данных MSSQL (getModel);
2. Генерация файлов модели TypeOrm (createTypeOrmEntities);
Примеры использования
...
// импорт модуля
const ModelGenerator = require('cl-mssql-model');
const run = async () => {
// создание генератора
const generator = new ModelGenerator();
// получение модели базы данных
const model = await generator.getModel({
host: 'server',
database: 'test',
user: 'sa',
password: '123',
port: 1433, // optional
});
// конфигурация для генерации сущностей TypeOrm
const config = {};
// генерация сущностей TypeOrm в каталоге 'entity'
await generator.createTypeOrmModel('entity', model, config);
};
run().then(() => {
console.log('ok.');
});
...
Допустим, что в базе есть две таблицы [tRoles] и [tUsers], связанные
между собой при помощи третьей таблицы [tRoleUsers]:
...
tRoles:
id: int
name: nvarchar(100)
tRoleUsers:
id: int
roleId: int
userId: int
tUsers:
id: int
name: nvarchar(100)
...
Если config пустой, то будет создано три файла:
...
// tRoles.ts
import ...
@Entity('tRoles', {schema: 'dbo'})
export class tRoles {
@PrimaryGeneratedColumn('int')
id: number;
@OneToMany(type => tRoleUsers, tRoleUsers => tRoleUsers.tRoles)
tRoleUsers: tRoleUsers[];
@Column('nvarchar', {length: 100})
name: string;
}
...
// tUsers.ts
import ...
@Entity('tUsers', {schema: 'dbo'})
export class tUsers {
@PrimaryGeneratedColumn('int')
id: number;
@OneToMany(type => tRoleUsers, tRoleUsers => tRoleUsers.tUsers)
tRoleUsers: tRoleUsers[];
@Column('nvarchar', {length: 100})
name: string;
}
...
// tRoleUsers.ts
import ...
@Entity('tRoleUsers', {schema: 'dbo'})
export class tRoleUsers {
@PrimaryGeneratedColumn('int')
id: number;
@ManyToOne(type => tUsers, tUsers => tUsers.tRoleUsers)
@JoinColumn({name: 'userId'})
tUsers: tUsers;
@ManyToOne(type => tRoles, tRoles => tRoles.tRoleUsers)
@JoinColumn({name: 'roleId'})
tRoles: tRoles;
}
...
Можно изменить наименования сущностей:
...
const config = {
tUsers: {
name: 'User',
},
tRoleUsers: {
name: 'RoleUser',
},
tRoles: {
name: 'Role'
}
};
...
Результат:
...
// Role.ts
import ...
@Entity('tRoles', {schema: 'dbo'})
export class Role {
@PrimaryGeneratedColumn('int')
id: number;
@OneToMany(type => RoleUser, RoleUser => RoleUser.Role)
RoleUsers: RoleUser[];
@Column('nvarchar', {length: 100})
name: string;
}
...
// User.ts
import ...
@Entity('tUsers', {schema: 'dbo'})
export class User {
@PrimaryGeneratedColumn('int')
id: number;
@OneToMany(type => RoleUser, RoleUser => RoleUser.User)
RoleUsers: RoleUser[];
@Column('nvarchar', {length: 100})
name: string;
}
...
// RoleUser.ts
import ...
@Entity('tRoleUsers', {schema: 'dbo'})
export class RoleUser {
@PrimaryGeneratedColumn('int')
id: number;
@ManyToOne(type => User, User => User.RoleUsers)
@JoinColumn({name: 'userId'})
User: User;
@ManyToOne(type => Role, Role => Role.RoleUsers)
@JoinColumn({name: 'roleId'})
Role: Role;
}
...
Можно изменить наименования полей:
...
const config = {
tUsers: {
columns: {
name: 'ExtName'
},
},
};
...
Результат:
...
// User.ts
import ...
@Entity('tUsers', {schema: 'dbo'})
export class User {
@PrimaryGeneratedColumn('int')
id: number;
@OneToMany(type => RoleUser, RoleUser => RoleUser.User)
RoleUsers: RoleUser[];
@Column('nvarchar', {length: 100})
ExtName: string;
}
...
Наименования полей в отношениях ManyToOne и OneToMany будут
сгенерированы автоматически. Иногда требуется изменить их:
...
const config = {
tUsers: {
name: 'User',
},
tRoleUsers: {
name: 'RoleUser',
manyToOne: {
userId: ['AAA', 'BBB'] // <---
},
},
tRoles: {
name: 'Role'
}
};
...
Результат:
...
// Role.ts
import ...
@Entity('tRoles', {schema: 'dbo'})
export class Role {
@PrimaryGeneratedColumn('int')
id: number;
@OneToMany(type => RoleUser, RoleUser => RoleUser.Role)
RoleUsers: RoleUser[];
@Column('nvarchar', {length: 100})
name: null;
}
...
// User.ts
import ...
@Entity('tUsers', {schema: 'dbo'})
export class User {
@PrimaryGeneratedColumn('int')
id: number;
@OneToMany(type => RoleUser, RoleUser => RoleUser.AAA)
BBB: RoleUser[]; // <---
@Column('nvarchar', {length: 100})
name: string;
}
...
// RoleUser.ts
import ...
@Entity('tRoleUsers', {schema: 'dbo'})
export class RoleUser {
@PrimaryGeneratedColumn('int')
id: number;
@ManyToOne(type => User, User => User.BBB)
@JoinColumn({name: 'userId'})
AAA: User; // <---
@ManyToOne(type => Role, Role => Role.RoleUsers)
@JoinColumn({name: 'roleId'})
Role: Role;
}
...
Если требуется сделать связку ManyToMany, то config должен
быть изменен следующим образом:
...
const config = {
tUsers: {
name: 'User'
},
tRoleUsers: {
name: 'RoleUser',
manyToMany: [
['roleId', 'AAA'], // <---
['userId', 'BBB'], // <---
]
},
tRoles: {
name: 'Role'
}
};
...
Результат:
...
// Role.ts
import ...
@Entity('tRoles', {schema: 'dbo'})
export class Role {
@PrimaryGeneratedColumn('int')
id: number;
@Column('nvarchar', {length: 100})
name: null;
@ManyToMany(type => User)
@JoinTable({
name: 'RoleUser',
joinColumns: [{name: 'roleId', referencedColumnName: 'id'}],
inverseJoinColumns: [{name: 'userId', referencedColumnName: 'id'}],
})
BBB: User[]; // <---
}
...
// User.ts
import ...
@Entity('tUsers', {schema: 'dbo'})
export class User {
@PrimaryGeneratedColumn('int')
id: number;
@Column('nvarchar', {length: 100})
name: string;
@ManyToMany(type => Role)
@JoinTable({
name: 'RoleUser',
joinColumns: [{name: 'userId', referencedColumnName: 'id'}],
inverseJoinColumns: [{name: 'roleId', referencedColumnName: 'id'}],
})
AAA: Role[]; // <---
}
...
// RoleUser.ts
import ...
@Entity('tRoleUsers', {schema: 'dbo'})
export class RoleUser {
@PrimaryGeneratedColumn('int')
id: number;
@Column('int')
userId: number;
@Column('int')
roleId: number;
}
...