1.0.4 • Published 5 years ago

cl-mssql-model v1.0.4

Weekly downloads
-
License
ISC
Repository
-
Last release
5 years ago

Функции модуля

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;
        }
    ...
1.0.4

5 years ago

1.0.3

5 years ago

1.0.2

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago