这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战
安装依赖
npm install --save sequelize
安装对应的数据库驱动
npm install --save pg pg-hstore # Postgres
npm install --save mysql2
npm install --save mariadb
npm install --save sqlite3
npm install --save tedious # Microsoft SQL Server
创建Sequelize实例连接数据库
const Sequelize = require('sequelize');
//方法1:单独传递参数
const sequelize = new Sequelize('database', 'username', 'password', {
host: '127.0.0.1',
dialect: /* 'mysql' | 'mariadb' | 'postgres' | 'mssql' 之一 */
});
// 方法2: 传递连接 URI
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');
Sequelize 将在初始化时设置连接池. 可以通过构造函数的 options 参数(使用options.pool)配置此连接池
const sequelize = new Sequelize(/* ... */, {
// ...
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
}
});
authenticate API测试连接效果
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});
关闭连接
调用sequelize.close()
建立表的数据模型
- Sequelize.Model.init(属性,参数)
const Model = Sequelize.Model;
class User extends Model {}
User.init({
// 属性
name: {
type: Sequelize.STRING,
allowNull: false
},
age: {
type: Sequelize.STRING
// allowNull 默认为 true
}
}, {
sequelize,
modelName: 'user'
// 参数
});
- sequelize.define
const User = sequelize.define('user', {
// 属性
name: {
type: Sequelize.STRING,
allowNull: false
},
age: {
type: Sequelize.STRING
// allowNull 默认为 true
}
}, {
// 参数
});
users 的表,有 name 和 age 字段. 默认情况下,表名复数习惯形式user->users可以通过使用 freezeTableName:true 参数可以禁止表名复数user->user,Sequelize 默认为每个模型定义了字段id(主键),createdAt和updatedAt.,默认字段名也是可以修改和取消
我这里平常导出封装好的各个环境的连接好数据库的sequelize实例
// host.js
let config = {
// 这是我们通过环境变量设置的
host: process.env.HOST || "localhost",
port: process.env.PORT || 6666,
mysql_server: process.env.MYSQL_SERVER || "mysql://root:@localhost:6666/test_app" // 本地开发数据库
}
module.exports = config
const Sequelize = require('sequelize');
let sequelize
let config = require("./host.js")
// 不同环境设置不同配置
switch (process.env.NODE_ENV) {
case 'test':
console.log('测试环境')
break;
case 'prod':
console.log('生产环境')
break;
// 本地
default:
console.log('开发环境')
console.log("数据库地址", config.mysql_server.split("@")[1])
}
sequelize = new Sequelize(config.mysql_server, {
pool: {
max: 5,
min: 0,
idle: 10000
},
// 每次查询datetime的字段,显示出来都是这种格式
// 初始化Sequelize的时候传入dialectOptions参数
// dialectOptions: {
// dateStrings: true,
// typeCast: true
// },
// logging: false,
timezone: '+08:00' // 解决时差 - 默认存储时间存在8小时误差
})
//测试数据库链接
sequelize.authenticate().then(function () {
console.log("数据库连接成功");
}).catch(function (err) {
//数据库连接失败时打印输出
throw err;
});
exports.sequelize = sequelize;
exports.Sequelize = Sequelize;