相信不少前端的玩家,在剛開始使用Node.js鏈接sql而且使用的時候,會感受至關繁瑣,甚至是有些困難。
不用怕!TypeORM幫你解決關於一切關於操做sql的問題!前端
本篇文章只做一個安利做用,不詳細描述TypeORM的使用,若有須要,請訪問 官網或者 Gitee介紹
增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拼接字符串啦,只須要調方法就能夠啦~框架
ORM(Object Relational Mapping)
框架採用元數據來描述對象與關係映射
的細節,元數據通常採用XML格式,而且存放在專門的對象一映射文件中。操做對象來操做數據庫
TypeORM
呢,天然就是一款適用於Node.js的ORM
框架啦咱們首先確定要定義一種映射關係,告訴這個框架,我操做這個對象是要改哪一個數據庫,否則那就瞎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 |
---|---|---|---|---|---|---|---|---|
** | ** | ** | ** | ** | ** | ** | ** | ** |
當咱們把項目搭建好,建立好實體之後呢,咱們就能夠經過操做實體來操做數據庫啦!
操做實體有兩種方法網站
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的使用,若是要詳細使用請查看官網噢。官方文檔寫得比較詳細,雖然是英文的,可是右鍵翻譯成中文
想來對你們也不是難事。祝生活愉快