Skip to content

Latest commit

 

History

History
160 lines (121 loc) · 4.41 KB

README_CN.md

File metadata and controls

160 lines (121 loc) · 4.41 KB

cassandra-orm4nest

Nestcassandraorm封装(底层基于cassandra-driver),封装方式参照了typeorm

安装

使用npm:

npm i cassandra-orm4nest --save

使用yarn:

yarn add cassandra-orm4nest

使用

实体定义

提供了@Entity@Column注解定义与表格、字段的映射关系。

// device.entity.ts
import { Column, Entity } from "cassandra-orm4nest";

@Entity({
    keyspace: 'test',
    table: 'device'
})
export default class Device {
    @Column({name: 'serial_number'})
    serialNumber: string;

    @Column({name: 'create_time'})
    createTime: Date;

    @Column()
    version: string;

    @Column({name: 'is_online'})
    isOnline: boolean;
}

module定义

typeorm实现类似,提供了forRoot方法配置数据库,forFeature方法注册实体。forRoot参数暴露的cassandra-driver连接选项,因而与cassandraClient参数一致。

// orm-test.module.ts
import { Module } from "@nestjs/common";
import { auth } from "cassandra-driver";

import { CassandraOrmModule } from "cassandra-orm4nest";
import DeviceController from "device.controller";
import Device from "device.entity";
import DeviceService from "device.service";

@Module({
    imports: [
        CassandraOrmModule.forRoot({
            contactPoints: ['localhost'],
            authProvider: new auth.PlainTextAuthProvider('username', 'password'),
            localDataCenter: 'datacenter1'
        }),
        CassandraOrmModule.forFeature([ // 需要生成mapper的实体
            Device
        ])
    ],
    controllers: [DeviceController], // controller实现
    providers: [DeviceService] // service实现
})
export default class OrmTestModule {}

service层定义

forFeature中注册了的实体都会生成相应的mapper对象。

  • 提供了@InjectMapper注解用于注入实体的mapper对象,得到的mapper对象类型为cassandra-drivermapping.ModelMapper对象。
  • 提供了@InjectClient注解可直接注入cassandra的连接客户端对象,类型为cassandra中的Client对象。
  • 提供了BaseService服务基类,可直接被实体的服务类继承,提供了基本的CURD方法,包括:
    • saveOne: 保存单个实体
    • saveMany: 保存多个实体
    • finadAll: 查询全表,直接暴露的ModelMapperfindAll,受cassandra-driver默认查询条数的限制,默认只返回前5000条。
    • findRealAll: 查询全表,返回全部数据,通过eachRow进行查询,不受默认条数限制。
    • findMany: 批量条件查询,与findAll情况一致,受默认条数限制。
    • findRealMany: 批量条件查询,与findRealAll情况一致,不受默认条数限制。
    • findOne: 条件查询第一条。
    • update: 常规条件更新
    • updateMany: 批量条件更新,一次执行多个条件更新
    • remove: 常规条件移除
    • removeMany: 批量条件删除,一次执行多个条件
    • delete: 转为原始cql命令后执行删除操作,相较于remove,可以不必写全所有主键
import { Injectable } from "@nestjs/common";
import { Client } from "cassandra-driver";

import { InjectClient, InjectMapper, BaseService } from "cassandra-orm4nest";
import Device from "device.entity";

@Injectable()
export default class DeviceService extends BaseService<Device> { // 继承服务基类,服务基类提供了基本的CURD方法
    constructor(
        @InjectMapper(Device) private readonly mapper,
        @InjectClient() client: Client
    ) {
        super(client, mapper, Device); // 父类构造
    }
}

controller层使用

直接在构造函数中注入服务类即可。

// device.controller.ts
import DeviceService from "device.service"
export default class DeviceController {
    constructor(
        private readonly deviceService: DeviceService // 直接注入
    ){}

    @Get('doSomthing')
    async doSomething() {
        // TODO
    }
}

运行测试

导入test/schema.cql至数据库:

cqlsh <host> -u <username> -p <password> < schema.cql

启动测试接口:

npm run test -- --host <db host> --username <db username> --password <db password> --datacenter <db datacenter>

访问连接:

http://localhost:30000/device/doSomthing

完整见test下示例

致谢

  • JetBrains提供免费的开源许可证