random recording 随心记录
What seems to us as bitter trials are often blessings in disguise.
看起来对我们痛苦的试炼,常常是伪装起来的好运。
使用ORM框架sequelize完成Mysql数据库操作
使用ts实现mysql配置/泛型+重载
配置接口实现
创建src/config/DbConfig.ts文件
interface DbConfig{
host: string, // 可选
user: string,
password: string,
port: number,
database: string
}
// 环境接口
interface EnvConf{
dev:DbConfig,
prod:DbConfig
}
实现环境配置类
- package.json设置环境变量
dev: set NODE_ENV=dev && nodemon --watch src/ -e ts --exec ts-node ./src/app.ts
prod: set NODE_ENV=prod && nodemon --watch src/ -e ts --exec ts-node ./src/app.ts
完善DbConfig.ts文件
function isString(data: any): data is string {
return typeof data === 'string'
}
interface DbConfig {
host: string, // 可选
user: string,
password: string,
port: number,
database: string
}
// 环境接口
interface EnvConf {
dev: DbConfig,
prod: DbConfig
}
class Conf {
static conf: Conf = new Conf()
env!: keyof EnvConf
envConf!: EnvConf
constructor() {
console.log(process.env.NODE_ENV)
this.env = process.env.NODE_ENV === "dev"?"dev":"prod"
console.log(this.env)
this.initConf()
}
initConf() {
this.envConf = {
dev: {
host: "192.168.136.129",
user: "admin",
password: "root",
port: 3306,
database: "test"
},
prod: {
host: "www.test.com",
user: "admin",
password: "root",
port: 3306,
database: "test"
}
}
}
getConf():DbConfig
getConf(key:string):string
getConf(key:any=''):any{
if(this.isDbConConfKeys(key)&&key.length>0){
return this.envConf[this.env][key]
}else{
return this.envConf[this.env]
}
}
isDbConConfKeys(key:any):key is keyof DbConfig{
return key === 'host' || key === 'user' || key === 'password' || key === 'database'
}
}
export default Conf.conf
app.ts引入测试
import dbconfig from './conf/DbConfig'
console.log(dbconfig.getConf())
ORM sequelize框架
ORM
ORM避免直接编写sql语句带来的繁琐,把关系型数据表直接映射为js对象查询,同时也将js对象转换为关系型数据表进行增删改
sequelize
基于promise的node.js ORM,支持postgres,mysql,mariadb,sqlite,mssql
- 支持事务
- 支持一对一,一对多,多对一,多对多 关联表映射
使用sequelize实现crud
sequelize连接mysql
创建src/dao/BaseDaoDefine.ts文件
import dbConfig from "@/conf/DbConfig";
import { Dialect } from "sequelize";
import { Sequelize } from "sequelize-typescript";
class BaseDaoDefine{
static baseDaoOrm:BaseDaoDefine = new BaseDaoDefine()
sequelize!:Sequelize
constructor(){
this.initSeqConf('mysql')
}
initSeqConf(dialect:Dialect){
let {host,user,password,database,port} = dbConfig.getConf()
this.sequelize = new Sequelize(database,user,password,{
host,
port,
dialect, // 方言 数据库类型
define:{timestamps:false,freezeTableName:true}
})
}
}
export const {sequelize} = BaseDaoDefine.baseDaoOrm
执行3种查询
使用sequelize define方法定义一个模型实现
- 适合对单表进行各种查询
- 适合单表添加,更新
- 适合多表级联添加,更新
- 不适合多表级联查询,有差异
使用sequelize原生操作
- 适合所有场景
使用模型类来实现
- 最适合对单表进行各种查询