这是该系列的第二篇,上一篇已经选好了技术框架,就得开始操刀敲代码了,下面跟着作者的思路实现数据库的创建和加载
第一步:创建目录
模块主要沿用了后端的模块思想,主要分为
controller
、dao
、service
、data-source
、models
,其中models
模块用于表达数据表对象,data-source
模块用于表达数据库连接对象
第二步:读取配置文件
该脚手架采用了yaml语言的配置文件,只需将配置文件读取解析出来即可
配置文件如下:
yml
base: service
datasource:
- master:
url: test.sqlite
models: models
加载代码如下:
js
const fse = require('fs-extra')
const path = require('path')
const YAML = require('yaml')
/**
* load the config file
*/
const appFile = fse.readFileSync(path.join(__dirname,'application.yml'), 'utf8')
const config = YAML.parse(appFile)
第三步:创建数据表对象
一个具有ORM特色的数据库框架,最主要的是对象-表
的关系的建立,以下代码就是创建了一个 User
模型,用于 User对象
和User表
建立映射关系
js
module.exports = (sequelize , DataTypes)=> {
let User = sequelize.define('User',{
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING
}
})
return User
}
第四步:创建 DataSource
通过配置文件,自动构建DataSource
,同时支持多数据源的构建,代码如下:
js
const fse = require('fs-extra')
const {Sequelize , DataTypes} = require('sequelize')
const path = require('path')
module.exports = dataSources => {
let map = new Map()
dataSources.forEach( async dataSource => {
let [name, config] = Object.entries(dataSource)[0]
let sequelize = null
if(!config.dialect || config.dialect === 'sqlite'){
sequelize = new Sequelize({
storage: config.url,
dialect: 'sqlite'
})
} else {
sequelize = new Sequelize({
url: config.url,
username:config.username,
password:config.password,
dialect: config.dialect
})
}
if(sequelize){
// 扫描模型文件夹,自动装配数据对象
let modelFiles = fse.readdirSync(path.join(__dirname,'..', config.models || 'models'))
modelFiles.forEach(modelFile=>{
require(path.join(__dirname,'..', config.models || 'models',modelFile))(sequelize,DataTypes)
})
await sequelize.sync()
map.set(name,sequelize)
}
})
return map
}
引入使用
js
const createDataSources = require('./data-source')
/**
* create dataSources
* @type {Map<any, any>}
*/
const dataSources = createDataSources(config['datasource'])