/** * mysql/sequelize * * 参考文档: * https://demopark.github.io/sequelize-docs-Zh-CN/ * https://sequelize.org/ * https://sequelize.org/api/v6/identifiers * https://www.sequelize.com.cn/ */ const config = require("./config") const Sequelize = require("sequelize"); const operatorsAliases = require("./operatorsAliases"); const Api = require("./api"); const Tool = require("./tool.js"); module.exports = async (app) => { const {database, username, password, options,} = config const sequelize = new Sequelize(database, username, password, { ...options, operatorsAliases:operatorsAliases, }); // 加载model文件 let list = await app.load(config.path) list.forEach(item => { const {res, parse} = item const model = {} let primaryKey = false for (let key of Object.keys(res.model)) { res.model[key].type = Sequelize[res.model[key].type] model[key] = res.model[key] //如果表设置了主键,那么就不设置默认主键为id了 if (res.model[key].primaryKey) { primaryKey = true res.model[key].allowNull = false res.model[key].unique = key res.model[key].autoIncrement = true } } //如果没有默认主键 if (!primaryKey) { model['id'] = { type : Sequelize.INTEGER, comment : '表自增id', allowNull : false, unique : 'id', primaryKey : true, autoIncrement: true, } } sequelize.define(parse.name, model) }) app.models = sequelize.models const api = new Api(sequelize, sequelize.models) app.db = api app.db.tool = new Tool(app, sequelize) //全局变量 app.alias["$db"] = app.db // console.log(api); // console.log(await app.db.table("User").find()); //等待所有插件载入完成后,自动更新数据库字段 //把所有模型的md5值存入到redis里面去,哪个文件的md5有变动就更新哪个表的字段. app.willReadyList.push(async () => { list.forEach(async item => { const {res, parse} = item const md5 = await app.redis.get("md5:" + parse.name) const newMd5 = getFileMd5(app.root + '/' + parse.dir + "/" + parse.base) if (!md5 || newMd5 !== md5) { //自动更新表字段 await app.models[parse.name].sync({alter: true}); console.log("自动更新表:", parse.name); //创建新的md5 await app.redis.mset("md5:" + parse.name, newMd5) } }) // await app.db.tool.reduction() }) } //文件md5值 function getFileMd5(url) { const buffer = require('fs').readFileSync(url); const hash = require('crypto').createHash('md5'); hash.update(buffer, 'utf8'); const md5 = hash.digest('hex'); return md5 }