在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的使用,若是要詳細使用請查看官網噢。官方文檔寫得比較詳細,雖然是英文的,可是右鍵翻譯成中文想來對你們也不是難事。祝生活愉快

相關文章
相關標籤/搜索