数据库连接
数据库连接
Sequelize
下载安装完成后,紧接着就是利用该模块对数据库建立连接,只有建立连接之后才能进一步对数据库表做常见的DDL
等操作。
建立连接
要连接到数据库,必须创建一个 Sequelize
实例。可以通过官方提供的Sequelize
构造函数来实现类初始化,查看源码:
如上图可以发现,Sequelize
官方提供了四个构造函数,用于创建Sequelize
实例,可以灵活配置username
、password
、uri
等信息,更多连接配置都在options
参数中
这里简单通过一些例子来配置构造函数参数,例如:
/**
* 数据库连接
*/
const { Sequelize } = require('sequelize')
// 方法 1: 传递一个连接 URI
const sequelize1 = new Sequelize('sqlite::memory:')
console.log(sequelize1)
const sequelize2 = new Sequelize('postgres://user:pass@142vip.cn:5432/142vip')
console.log(sequelize2)
// 方法 2: 分别传递参数 (sqlite)
const sequelize3 = new Sequelize({
dialect: 'sqlite',
storage: 'path/to/database.sqlite',
})
console.log(sequelize3)
// 方法 2: 分别传递参数 (其它数据库)
const sequelize4 = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'mysql',
})
console.log(sequelize4)
上面的dialect
参数是用来指明连接的数据库类型,目前支持的有:
mysql
postgres
sqlite
mariadb
mssql
db2
snowflake
oracle
注意:在传递数据库参数的时候,sqlite
数据库与其他数据库不一致。
连接池技术
const { Sequelize } = require('sequelize')
const sequelize = new Sequelize({
// ... 连接配置
// 连接池配置
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000,
},
})
console.log(sequelize)
从多个进程连接到数据库,则必须为每个进程创建一个实例,但每个实例都应具有最大连接池大小,以便遵守总最大大小。例如,如果您希望最大连接池大小为 90 并且拥有三个进程,则每个进程的 Sequelize
实例的最大连接池大小应为 30。
读写分离技术
/**
* 配置读写分离
* @type {Sequelize}
*/
const { Sequelize } = require('sequelize')
/**
* 创建连接实例
*/
const sequelize = new Sequelize('database', null, null, {
dialect: 'mysql',
port: 3306,
// 配置读写分离
replication: {
read: [
{ host: '192.168.125.100', username: 'root', password: 123456 },
{ host: '192.168.125.101', username: 'root', password: 123456 },
],
write: { host: '192.168.125.101', username: 'root', password: 123456 },
},
// 配置连接池
pool: {
max: 20,
idle: 30000,
},
})
测试连接
可以使用 sequelize.authenticate()
函数测试连接是否正常,无法连接数据库时,会抛出异常。
/**
* 连接测试
*/
const { Sequelize } = require('sequelize')
const sequelize = new Sequelize('postgres://user:pass@142vip.cn:5432/142vip')
try {
await sequelize.authenticate()
console.log('连接成功')
}
catch (error) {
console.error('连接失败:', error)
}
关闭连接
默认情况下,Sequelize
将保持连接打开状态,并对所有查询使用相同的数据库连接。 如果需要关闭连接,可以 sequelize.close()
函数。例如:
// 关闭sequelize连接,支持async/await调用
sequelize.close()
当使用sequelize.close()
关闭数据库连接后,不能基于当前的sequelize
对象重新打开连接, 需要基于Sequelize
重新创建实例才能再一次访问数据库。
配置日志
当数据库连接建立后,可以使用Sequelize
提供的API
方法进行数据库操作, 大部分API
都是异步的,返回的事Promise
对象,因此支持async/await
操作。
也可以直接使用回调的方式使用API
方法,例如:
// 支持async/await操作
sequelize.close()
/**
* 开箱即用Promise API方法
*/
sequelize.close()
.then((e) => {
// 业务逻辑
})
.catch((e) => {
// 异常捕获
})
.finally(() => {
})
默认情况下,Sequelize
将记录它执行的每个 SQL
查询并打印在控制台。
Sequelize
的构造函数中提供options.logging
选项可用于自定义日志输出,默认值是console.log
,将日志输出到终端。 也可以自己定义每次Sequelize
记录某些内容时执行的函数,使用时仅显示日志函数调用的第一个日志参数。
例如:对于查询日志记录
- 第一个参数是原始查询信息
- 第二个参数(默认情况下隐藏)是
Sequelize
对象
/**
* logging选项的常用配置
*/
const sequelize = new Sequelize('postgres://user:pass@142vip.cn:5432/142vip', {
// 默认打印记录到控制台
logging: console.log,
// 打印所有日志信息
logging: (...msg) => console.log(msg),
// 关闭日志打印
logging: false,
// 自定义日志信息的展示方式
logging: msg => logger.debug(msg),
// 自定义任意方式来处理日志信息
logging: logger.debug.bind(logger)
})