nodejs -swquelize-ORM框架

136 阅读3分钟

ORM框架

认识ORM框架

  • ORM框架就是为了避免直接编写sql语句带来的繁琐,而把关系型数据表数据直接映射为js对象进行查询,同时也能把js对象转为关系型数据表的数据进行增加,修改或者删除

sequelize

  • swquelize 是一个基于promise的node.js ORM 目前支持Postgres,mysql,mariaDB,SQLite以及MicrosoftSQL Server

Sequelize主要特点

  • 支持事务
  • 支持一对一,一对多,多对一,多对多,关联表的映射

如何使用sequelize完成CRUD

第一步 sequelize 链接数据库

import {where, op,ModelAttributes,DataTypes} from 'sequelize'
import {Sequelize,ModelStatic,Model} from 'sequelize-typescript'
//
import dbconfig from "./dbconfig";
import { Dialect } from "sequelize";
import { Sequelize } from "sequelize-typescript";
class BaseDaoDefine {
  static baseDaoOrm: BaseDaoDefine = new BaseDaoDefine();
  mySquelize!: Sequelize;
  constructor() {
    this.initSquelize("mysql");
  }
  initSquelize(dialect: Dialect) {
      //创建sequelize对象,参数分别为:数据库名称、数据库类型、密码、配置
    let { host, user, password, database, port } = dbconfig.getConf();
    this.mySquelize = new Sequelize(database, user, password, {
      host,
      port,
      dialect, //何种数据库
      define: {
          timestamps: false,  //ture表示给模型加上时间戳属性(createAt、updateAt),fasle表示不带时间戳属性
          freezeTableName: true //true 表示使用给定的表名,fasle表示模型的表名后加s
      },
    });
  }
}
export const {mySquelize}=BaseDaoDefine.baseDaoOrm  //导出创建的Sequelize对象

同步数据表

​
import { DataTypes } from "sequelize";
import { mySquelize } from "../common/BaseDao";
​
class Userinfo {
 static createModel() {
   const model= mySquelize.define("userinfo", {
      userid: {
        type: DataTypes.INTEGER,
        field: "userid", //数据表中的字段,不填默认取key值,推荐写上
        primaryKey: true,
        autoIncrement: true,
      },
      username: {
        type: DataTypes.STRING(30),
        field: "username",
        allowNull: false,
      },
      password: {
        type: DataTypes.STRING(30),
        field: "password",
        allowNull: false,
      },
      age: {
        type: DataTypes.INTEGER,
        field: "age",
        allowNull: false,
      },
      type: {
        type: DataTypes.INTEGER,
        field: "type",
        allowNull: false,
      },
    });
    model.sync({force:false}) //同步数据库,froce的值为true 表示若存在先删除在创建,froce为false表示不纯在才创建
    return model
  }
}
export const mode=Userinfo.createModel();
​

第二步:执行查询(有三个方案)

方案一:使用sequelize的define方法定义一个模型来实现

适合对单表进行的各种查询

适合单表添加更新

适合多表级联添加,更新

不适合多表级联查询,和前端取出数据相差甚远

//模型页面
import { DataTypes } from "sequelize";
import { mySquelize } from "../common/BaseDao";
​
class Userinfo {
  static createModel() {
    const model = mySquelize.define("userinfo", {
      userid: {
        type: DataTypes.INTEGER,
        field: "userid", //数据表中的字段,不填默认取key值,推荐写上
        primaryKey: true,
        autoIncrement: true,
      },
      username: {
        type: DataTypes.STRING(30),
        field: "username",
        allowNull: false,
      },
      password: {
        type: DataTypes.STRING(30),
        field: "password",
        allowNull: false,
      },
      address: {
        type: DataTypes.STRING,
        field: "address",
        allowNull: false,
      },
      age: {
        type: DataTypes.INTEGER,
        field: "age",
        allowNull: false,
      },
      type: {
        type: DataTypes.INTEGER,
        field: "type",
        allowNull: false,
      },
    });
    model.sync({ force: false }); //同步数据库,froce的值为true 表示若存在先删除在创建,froce为false表示不纯在才创建
    return model;
  }
}
export const model = Userinfo.createModel();
​
​
// model
import { model } from "./user";
import { Op, Sequelize } from "sequelize";
class UserDaoDefine {
  // 新增用户
  static addUser(userinfo: Userinfo) {
    return model.create(userinfo);
  }
  // 查询所有用户
  static findAllUser() {
    return model.findAll({
      raw: true, //只看数据库的原值
    });
  }
  // 查询指定的属性
  static findByProps() {
    return model.findAll({
      raw: true,
      attributes: ["username", "password"],
    });
  }
  // 条件查询只查一个
  static findByUsrAndPsw(username: string, password: string) {
    return model.findOne({
      raw: true,
      where: {
        [Op.or]: [{ username }, { password }],
      },
    });
  }
  // 模糊查询
  static findBylike(key: string) {
    return model.findAll({
      raw: true,
      where: {
        username: {
          [Op.like]: `%${key}%`,
        },
      },
    });
  }
  // or查询
  static findByuserAndAddr(username: string, age: number | string) {
    return model.findAll({
      raw: true,
      where: {
        [Op.or]: [
          {
            username: {
              [Op.like]: `%${username}%`,
            },
          },
          {
            age,
          },
        ],
      },
    });
  }
  // and查询
  static findeByusernameAndpwd(username: string, password: string | number) {
    return model.findOne({
      raw: true,
      where: {
        [Op.and]: [
          {
            username,
          },
          {
            password,
          },
        ],
      },
    });
  }
  // 聚合查询
  static coutUserifo() {
    return model.findAll({
      raw: true,
      where: {
        type: 1,
      },
      group: "address",
      attributes: [
        "address",
        [Sequelize.fn("count", Sequelize.col("type")), "totalCount"],
      ],
    });
  }
  // 分页查询
  static findUserWithPager(limit:number  =5,size:number =1){
    return model.findAll({
      raw:true,
      limit,
      offset:(size-1)*limit
    })
  }
}
export type Userinfo = {
  userid?: number;
  username: string;
  password: string;
  type: number;
  age: number;
  address: string;
};
export const {
  addUser,
  findAllUser,
  findByProps,
  findByUsrAndPsw,
  findBylike,
  findByuserAndAddr,
  findeByusernameAndpwd,
  coutUserifo,
  findUserWithPager
} = UserDaoDefine;
​

方案2:使用sequelize的原生操作

适合场景:适合所有的增删改查

方案3:使用模型类来实现

应用场景:最适合对单表进行各种查询

//BaseDaoOrm.ts
import { Dialect } from "sequelize";
import { Sequelize } from "sequelize-typescript";
import dbconfig from "../common/dbconfig";
import path from 'path'
class BaseDaoOrm {
  static baseDaoOrm: BaseDaoOrm = new BaseDaoOrm();
  sequelize!: Sequelize;
  constructor() {
    this.initSequeConf('mysql');
  }
  initSequeConf(dialect: Dialect) {
    // 创建sequelize对象,参数分别为:数据库名,数据库类型,密码,配置
    let { host, user, password, database, port } = dbconfig.getConf();
    this.sequelize = new Sequelize(database, user, password, {
      host,
      port,
      dialect, //表示何种数据库
      define: { timestamps: false, freezeTableName: true }, //freezeTableName true 表示使用给定的表名,fasle表示模型的表名后加s
      //// timestamps ture表示给模型加上时间戳属性(createAt、updateAt),fasle表示不带时间戳属性
    });
    this.addModels() //只能在创建链接之后去调用
  }
  addModels(){
    const modelPath=path.join(process.cwd(),"/src/ormmodel")
    this.sequelize.addModels([modelPath])
  }
}
export default BaseDaoOrm.baseDaoOrm//UserDaoOrm.ts
import './BaseDaoOrm'
import { Op, Sequelize } from "sequelize";
import UserinfoModel from '../ormmodel/userinfo';
​
class UserDaoOrm {
    static userDaoOrm:UserDaoOrm=new UserDaoOrm()
    findByLike(key:string) {
        const searchkey=`%${key}%`
        return UserinfoModel.findAll({
            raw:true,
            where:{
                username:{
                    [Op.like]:searchkey
                }
            }
        })
    }
    findAllUser () {
        return UserinfoModel.findAll()
    }
}
export default UserDaoOrm.userDaoOrm