在Node.js上纵享丝滑地操纵SQL~【TypeORM】

前言

相信不少前端的玩家,在刚开始使用Node.js链接sql而且使用的时候,会感受至关繁琐,甚至是有些困难。
不用怕!TypeORM帮你解决关于一切关于操做sql的问题!前端

本篇文章只做一个安利做用,不详细描述TypeORM的使用,若有须要,请访问 官网或者 Gitee介绍

1.先看看效果

  • git

    //在tag表中加入一条新记录
    const insertOne = async (name: string,memo:string) => {
      try {
        let tag = new Tag();
        tag.name = name;
        tag.memo = memo;
        await getConnection().manager.save(tag);
        return true;
      } catch (err) {
        return err;
      }
    };
  • sql

    //传入一个实体和id,删除这个实体(表)中id为传入值的记录
    const deleteOne = async (entity, id: number) => {
        try {
          const repository = getRepository(entity);
          await repository.delete(id);
          return true;
        } catch (err) {
          return err;
        }
      };
  • 数据库

    //传入须要操做的实体(表),id,以及须要更新的参数
     const updateOne = async (entity, id: number, params: object) => {
        try {
          const repository = getRepository(entity);
          let result = await repository.update(id, params);
          return true ;
        } catch (err) {
          return err;
        }
      };
  • app

    //根据传入的实体(表)和id精确查询
    const findOne = async (entity, id:number) => {
        try {
          const repository = getRepository(entity);
          let result = await repository.findOne(id);
          return result;
        } catch (err) {
          return err;
        }
      };
      
    //根据传入的实体查询所有
    const findAll = async (entity, relations: string[] = null) => {
        try {
          const repository = getRepository(entity);
          return await repository.find({
              relations, //查表的时候把外键所在表的信息也查出来
              order: { //根据createTime这个列来进行排序
                createTime: "DESC"
              }
            });
        } catch (err) {
          return err;
        }
      };
    
    //分页查询
    export const $_findPaginated = async (
    entity,
    pageIndex,
    pageSize,
    relations: string[] = null
      ) => {
        try {
          const repository = getRepository(entity);
          return await repository.findAndCount({
              skip: (pageIndex - 1) * pageSize,//跳过多少
              take: pageSize,//取多少
              relations,
              order: {
                createTime: "DESC"
              }
            });
        } catch (err) {
          return err;
        }
      };

很是简单!!很是纯粹的js写法!!并且封装起来使用很是方便,上面列出的方法除了第一个(因我的项目缘由未封装),其余的我都封装起来使用了,不用一遍一遍写sql拼接字符串啦,只须要调方法就能够啦~框架

2.什么是TypeORM

  • 首先说说ORM
    ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据通常采用XML格式,而且存放在专门的对象一映射文件中。
  • 意思就是咱们能够经过操做对象来操做数据库
  • TypeORM呢,天然就是一款适用于Node.js的ORM框架啦

3.如何经过操做对象来操做数据库

咱们首先确定要定义一种映射关系,告诉这个框架,我操做这个对象是要改哪一个数据库,否则那就瞎JB改了阿。
那么这种关系如何肯定呢?
TypeORM使用了一个实体的概念(第一部分个人注释里也一直强调操做实体就是操做表),实体是一个映射到数据库表(或使用MongoDB时的集合)的类,以下所示async

import { Entity, Column, PrimaryGeneratedColumn,CreateDateColumn,UpdateDateColumn } from "typeorm";
  //下面使用了的列,别忘了在上面import噢

  //一个照片实体,对应的数据库一个Photo表
  @Entity()
  export class Photo {
    @PrimaryGeneratedColumn()
    //一个自增的而且是主键
    id: number;

    @Column({
      length: 100
    })
    //长度限制为100的string列,对应数据库里就是varchar类型
    name: string;

    @Column("text")
    //长度不限,对应数据库里就是text类型
    description: string;

    @Column()
    //什么都不设置的时候须要注意!!会默认设置NOT NULL!插入时必定要设定这一字段的值
    filename: string;

    @column({
      default:"默认值"
    })
    //若是设置了默认值,那么当插入的时候能够不设定这一值
    memo:string

    @Column("double")
    //对应数据库里double类型
    views: number;

    @Column()
    isPublished: boolean;

    @CreateDateColumn()
    //这个列会在插入的时候自动以当前时间赋值,更新时不改变值
    createTime:string

    @UpdateDateColumn()
    //这个列会在插入和更新的时候以当前时间赋值
    updateTime:string

    //至于剩下的连表相关的列(@ManyToOne,@OneToMany,@ManyToMany),请在以上给出的两个网站中进行学习,博文字数有限,不做详细展开
  }

显而易见的是,咱们写好了以上的定义之后,数据库里就会生成一个表Photo,这样咱们就用js写好了一个建立表的sql语句!学习

id name description fileName memo views isPublished createTime updateTime
** ** ** ** ** ** ** ** **

4.操做实体(操做数据库)

当咱们把项目搭建好,建立好实体之后呢,咱们就能够经过操做实体来操做数据库啦!
操做实体有两种方法网站

  • 使用实体管理器EntityManager
  • 使用储存库Repository

这两个东西有什么区别呢?
emm,没什么不一样。
EntityManager就像单个位置上全部实体存储库的集合同样。而Repository虽然与EntityManager相似,可是Repository操做仅限于具体实体,因此Repository须要传入实体来建立!
以下翻译

import "reflect-metadata";
import { getManager,getRepository } from "typeorm";
import {Photo} from "./entity/Photo"

let manager = getManager();
let repository = getRepository(Photo);

而后你就可使用这两个玩意儿来随心所欲啦!

后语

本文只简单介绍了TypeORM的使用,若是要详细使用请查看官网噢。官方文档写得比较详细,虽然是英文的,可是右键翻译成中文想来对你们也不是难事。祝生活愉快

相关文章
相关标签/搜索