从零实现一套低代码(保姆级教程)【后端服务】 --- 【21】实现数据库的动态建表等接口

这篇具有很好参考价值的文章主要介绍了从零实现一套低代码(保姆级教程)【后端服务】 --- 【21】实现数据库的动态建表等接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要

在前面的两篇文章,我们主要是通过Upload组件和Image组件,真正的做到了设计器和后端服务之间的数据传递。

有了这个例子,应该比较清楚,对于低代码项目的服务端,它主要做的是一个抽象的数据存储

因为正常做开发,后端主要是对某个字段的数据进行存储,例如姓名,年龄等。但是对于低代码的后端,它的存储没有具体到某个字段,也没有具体的数量,它是和设计器里面的字段进行关系映射。

当然,这是后话,目前我们能做的,就是说如何在我们的项目里面,可以创建数据库的表,例如我创建一张学生表,创建一张教师表。用于后面我们拖拽页面的时候,作为数据存储的地方(当然具体怎么用,我们后面再说)。

当下,我们需要把数据库的动态操作给做出来。我们需要完成的事情有:

  1. 添加数据库表
  2. 获取全部数据库表
  3. 删除数据库表

这里因为数据库的操作可能比较频繁,所以建议读者下载一个可视化操作数据库的软件。我这里使用的是Studio 3T Free for MongoDB。

数据库动态建表,低代码,数据库,rxjava

1.实现创建实体的接口

首先,我们在src下新增和数据库表相关的模块:

数据库动态建表,低代码,数据库,rxjava

现在我们想一下,我们创建的数据库表应该在哪里,其实我们就可以放在localData这个数据库里面,但是因为我们之前这里有存放页面信息的数据库,所以localData数据库中的全量表,并非全都是通过这个模块创建的。

所以我们需要有一张表来记录,我们通过可视化建表的方式,创建的数据库表有哪些。

数据库动态建表,低代码,数据库,rxjava

OK,现在我们可以实现创建数据库表的接口了,创建表我们需要做两件事情:

  1. 创建一张新的数据库表
  2. 将数据库表的ID放在Data-Base表中

创建一张数据库表需要的数据结构是什么样子的呢?

我们需要数据库表的名字,数据库表的编码,数据库表的Schema

为了后面方便叙述,我们统称数据库表为实体

数据库表的Schema:代表的是这个表需要什么字段,比如一张学生表需要学生姓名,学生学号,学生年级等。学生姓名是String类型,学生年龄是Number类型。而用来描述学生表信息的,就是学生表的Schema。

所以我们在dto.ts, sechema.tsinterface.ts中,可以写出创建实体需要的数据结构了:

export class createEntity {
  readonly entityName: string
  readonly entityCode: string
  readonly entitySchema: Object
}

xin-builder-server2\src\data-base\data-base.interface.ts

export interface Entity extends Document {
  readonly entityName: string
  readonly entityCode: string
  readonly entitySchema: Object
}

xin-builder-server2\src\data-base\data-base.schema.ts

import { Schema } from 'mongoose';
 
export const EntitySchema = new Schema({
  entityName: { type: String, required: true },
  entityCode: { type: String, required: true },
  entitySchema: {type: Object, required: true}
});

有了数据结构之后,我们开始编写创建实体的方法,来到service中:
xin-builder-server2\src\data-base\data-base.service.ts

import { Injectable } from "@nestjs/common";
import { InjectModel } from "@nestjs/mongoose";
import mongoose, { Model,Schema } from 'mongoose'
import {createEntity} from './data-base.dto'
import { Entity } from "./data-base.interface";
import { EntityInfo } from "./data-base.dto";

const DBRootModule = mongoose.createConnection('mongodb://127.0.0.1/localData');

@Injectable()
export class EntityService {
  constructor(@InjectModel('Entity') private readonly EntityModule:Model<Entity>){}

  async addEntity(body: createEntity): Promise<void> {
    const DBRootModule = mongoose.createConnection('mongodb://127.0.0.1/localData');
    await this.EntityModule.create(body)
    DBRootModule.model(body.entityCode,new Schema(body.entitySchema),body.entityCode);
  }
}

await this.EntityModule.create(body): 在entities表中,加入当前新建实体的信息。

DBRootModule.model(body.entityCode,new Schema(body.entitySchema),body.entityCode):
就是创建一张新的数据库表。


来到controller中:
xin-builder-server2\src\data-base\data-base.controller.ts

import { Body, Controller, Post } from "@nestjs/common";
import {EntityService} from './data-base.service'
import { createEntity, EntityInfo } from "./data-base.dto";
import { ApiTags, ApiOperation } from '@nestjs/swagger'

@Controller('entity')
@ApiTags('实体管理')
export class EntityController {
  constructor(private readonly EntityService: EntityService){}

  @Post('addEntity')
  @ApiOperation({summary: '创建实体'})
  async addEntity(@Body() createEntity: createEntity){
    return {
      code: 200,
      data: await this.EntityService.addEntity(createEntity),
      message: 'Success.'
    };
  }
}


最后来到module中:
xin-builder-server2\src\data-base\data-base.module.ts

import { Module } from "@nestjs/common";
import { EntityController } from "./data-base.controller";
import { EntityService } from "./data-base.service";
import { MongooseModule } from '@nestjs/mongoose';
import { EntitySchema } from "./data-base.schema";

const EntitySchemaTable = MongooseModule.forFeature([{ name: 'Entity', schema: EntitySchema }]);

@Module({
  imports: [EntitySchemaTable],
  controllers: [EntityController],
  providers: [EntityService]
})
export class EntityModal {}

这样我们创建实体的接口就完成了。

2.实现删除实体和获取实体列表的接口

来到service中,我们写一下获取实体列表和删除实体的方法:
删除接口也需要做两件事:

  1. 删除entities中的对应信息
  2. 删除对应的数据库表
  async getEntityList(): Promise<Entity []> {
    const entityList = await this.EntityModule.find();
    return entityList
  }

  async delEntityItem(body: EntityInfo): Promise<void> {
    if(!body.entityCode){
      return;
    }
    await this.EntityModule.deleteOne({entityCode: body.entityCode});
    DBRootModule.dropCollection(body.entityCode)
  }

在来到controller中,我们实现一下这两个方法的调用:

  @Post('getEntityList')
  @ApiOperation({summary: '获取实体列表'})
  async getEntityList(){
    return {
      code: 200,
      data: await this.EntityService.getEntityList(),
      message: 'Sucess'
    }
  }

  @Post('delEntityItem')
  @ApiOperation({summary: '删除实体'})
  async delEntityItem(@Body() EntityInfo: EntityInfo){
    return {
      code: 200,
      data: await this.EntityService.delEntityItem(EntityInfo),
      message: 'Sucess'
    }
  }

最终我们可以在Swagger文档进行测试一下:

数据库动态建表,低代码,数据库,rxjava
这里,我们就实现了数据库表的添加,查询,和删除了。

相关的代码提交在github上:
https://github.com/TeacherXin/XinBuilderServer2
commit: fix: 第四节:实现添加,查询,删除实体的接口文章来源地址https://www.toymoban.com/news/detail-836564.html

到了这里,关于从零实现一套低代码(保姆级教程)【后端服务】 --- 【21】实现数据库的动态建表等接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 保姆级教程从零搭建云服务器(小彩蛋,请大家看烟花秀)

    笔者已从零搭建好云服务器,在文章开始笔者请大家看一场简单的烟花秀,该篇博文是写给小白的保姆级教程,不论是有基础还是没基础的,都可以根据本篇博文,轻松搭建个人云服务器。 烟花秀:浏览器直接输入ysw.world:666回车即可,由于个人域名没有备案,所以目前只能

    2024年02月03日
    浏览(44)
  • 保姆级教程!!教你通过【Pycharm远程】连接服务器运行项目代码

    这篇文章主要解决一个问题—— 我有服务器,但是不知道怎么拿来写代码,跑深度学习项目 。确实,玩深度学习的成本比较高,无论是前期的学习成本,还是你需要具备的硬件成本,都是拦路虎。小罗没有办法帮你解决硬件上的问题,所以只能帮你们理清一下有了服务器以

    2024年03月27日
    浏览(54)
  • 【模型+代码/保姆级教程】使用Pytorch实现手写汉字识别

    参考文章: 最初参考的两篇: 【Pytorch】基于CNN手写汉字的识别 「Pytorch」CNN实现手写汉字识别(数据集制作,网络搭建,训练验证测试全部代码) 模型: EfficientNetV2网络详解 数据集(不必从这里下载,可以看一下它的介绍): CASIA Online and Offline Chinese Handwriting Databases 鉴于

    2024年02月07日
    浏览(44)
  • Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

    目录 人物的创建以及刚体的设置 图层渲染层级设置 角色碰撞箱设置 使用代码控制人物移动 创建脚本文件  初始函数解释 控制移动代码 初始化变量  获得键盘输入  调用函数 手册链接在这:Unity User Manual (2019.3) - Unity 手册 没有控制人物移动的2D游戏就太说不过去了!那么接

    2024年02月06日
    浏览(43)
  • docker从零部署jenkins保姆级教程

    jenkins,基本是最常用的持续集成工具。在实际的工作中,后端研发一般没有jenkins的操作权限,只有一些查看权限,但是我们的代码是经过这个工具构建出来部署到服务器的,所以我觉着有必要了解一下这个工具的搭建过程以及简单的一些使用。尽可能多的了解公司中和你开

    2024年02月10日
    浏览(51)
  • 高级圣诞树代码实现合集-保姆级教程【前端三件套实现—0基础直接运行】

    0基础直接运行教程: 1.新建txt文本: 2.将代码粘贴到txt文本里: 3.将后缀改为html 4.双击打开html文件,观察效果~ 这段代码是一个用HTML和JavaScript实现的圣诞树动画效果。我将代码分成几个部分进行讲解。 HTML结构: 在 head 标签中定义了页面的标题、字符集和样式。 样式部分

    2024年02月04日
    浏览(65)
  • docker从零部署jenkins保姆级教程(下)

    上一篇文章,我们完成了以下工作。 1)、docker部署jenkins 2)、建立第一个jenkins job 3)、通过jenkins job自动编译构建我们的github项目 上面所做的3个工作,其实都是为了这一篇文章打基础,不管是部署docker还是部署jenkins,我们最终的目的还是部署我们的项目,让项目跑起来,让流

    2024年02月09日
    浏览(86)
  • docker从零部署jenkins保姆级教程(上)

    jenkins,基本是最常用的持续集成工具。在实际的工作中,后端研发一般没有jenkins的操作权限,只有一些查看权限,但是我们的代码是经过这个工具构建出来部署到服务器的,所以我觉着有必要了解一下这个工具的搭建过程以及简单的一些使用。尽可能多的了解公司中和你开

    2024年02月09日
    浏览(45)
  • 保姆级教程:从零构建GitHub Pages静态网站

    Github Pages官网:https://pages.github.com/ GitHub Pages 是 GitHub 提供的一个免费的静态网站托管服务,它允许 GitHub 用户创建和托管自己的静态网站,这些网站可以通过特定的 GitHub 仓库进行管理和托管。 GitHub Pages 的主要特点包括 : 免费托管 : GitHub Pages 提供免费的静态网站托管服务

    2024年02月04日
    浏览(55)
  • 「教程」如何使用一套代码在多种程序中接入天气预警API

    天气预警的重要性不言而喻,在遭受自然灾害和极端天气时,及时获得预警信息可以拯救生命和减少财产损失。如今,随着科技的进步,开发者和企业可以借助天气预警 API 这款强大的服务,将实时预警信息集成到自己的应用中,为用户提供准确的预警通知。 本文将重点探讨

    2024年02月14日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包