Files
2022-08-02 19:21:03 +08:00

94 lines
2.6 KiB
JavaScript

/**
* 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
}