nestJS中TypeORM如何根据请求参数动态查询表?

新手上路,请多包涵

假设有两个数据库,其中date数据库的表每天一张,表名根据日期创建:20230801,20230802...

要根据请求的接口参数日期范围,动态去连接表查询该如何操作呢?

imports: [
        TypeOrmModule.forRoot({
            name: 'db1Connection', // 指定连接名称
            type: 'mysql',
            host: 'localhost',
            port: 3306,
            username: 'root',
            password: '123456',
            database: 'date',
            entities: [Date],
            autoLoadEntities:true, // 自动加载实体
            synchronize: true,
        }),
        TypeOrmModule.forRoot({
            name: 'db2Connection', // 指定连接名称
            type: 'mysql',
            host: 'localhost',
            port: 3306,
            username: 'root',
            password: '123456',
            database: 'test',
            entities: [Goods],
            autoLoadEntities:true, // 自动加载实体
            synchronize: true,
        }),
        TypeOrmModule.forFeature([Date], 'db1Connection'),
        TypeOrmModule.forFeature([Goods], 'db2Connection')
    ],

实体指定表名查询是OK的。

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity('good')
export class Goods {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 128 })
  name: string;

  @Column()
  desc: string;

  @Column()
  price: number;

  @Column()
  sum: number;

}
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Date {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 128 })
  title: string;

  @Column()
  content: string;

  @Column()
  userId: number;
}

上面的实体没有指定表名,每次查询自动创建了一个 date 表 。。
目前数据库有如下表:
20230801
20230802
20230803

我想的是根据查询的参数去动态查询这些表,可能是一张也可能是多张表

import { Injectable, Inject } from '@nestjs/common';
import { Repository, EntityManager } from 'typeorm';
import { InjectRepository, InjectEntityManager, } from '@nestjs/typeorm';

import { Date } from 'src/entitys/date.entity';
import { Goods } from 'src/entitys/goods.entity';

@Injectable()
export class DateService {
  constructor(
    @InjectRepository(Date, 'db1Connection') private dateRepository: Repository<Date>,
    @InjectRepository(Goods, 'db2Connection') private goodsRepository: Repository<Goods>,
  ) {}


  async findByDate() {

  }

  async findAll() {

  }

  async findGoods() {
    return this.goodsRepository.find();
  }
}
阅读 3.8k
1 个回答

用注解定义实体,是程序加载的时候就定义了,@Entity() 不传参数相当于用class 名作为表名。

实体可以分离定义:

import {EntitySchema} from "typeorm";

export const CategoryEntity = new EntitySchema({
    name: "category",
    columns: {
        id: {
            type: Number,
            primary: true,
            generated: true
        },
        name: {
            type: String
        }
    }
});

然后再使用:

// 请求数据
const categoryRepository = getRepository<Category>(CategoryEntity);
const category = await categoryRepository.findOne(1); // category is properly typed!

// 插入一条新category到数据库
const categoryDTO = {
  // 注意id是自动生成的,请参考上面的架构定义。
  name: 'new category',
};
const newCategory = await categoryRepository.save(categoryDTO);

参考:typeorm

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题