Files
bamboo/extend/mysql/index.js
T
2022-06-01 06:42:50 +08:00

77 lines
2.0 KiB
JavaScript

/**
* mysql/sequelize
*
* 参考文档:
* 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");
module.exports = async (app) => {
const {database, username, password, options,} = config
const sequelize = new Sequelize(database, username, password, {
...options,
operatorsAliases,
});
// 加载model文件
let list = await app.load(config.path)
list.forEach(item => {
const {res, parse} = item
const model = {}
for (let key of Object.keys(res.model)) {
res.model[key].type = Sequelize[res.model[key].type]
model[key] = res.model[key]
}
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
// 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)
}
})
})
}
//文件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
}