跳至主要內容

数据库连接

微信公众号:储凡About 9 min

数据库连接

Sequelize下载安装完成后,紧接着就是利用该模块对数据库建立连接,只有建立连接之后才能进一步对数据库表做常见的DDL等操作。

建立连接

要连接到数据库,必须创建一个 Sequelize 实例。可以通过官方提供的Sequelize构造函数来实现类初始化,查看源码:

Sequelize的四种构造函数
Sequelize的四种构造函数

如上图可以发现,Sequelize官方提供了四个构造函数,用于创建Sequelize实例,可以灵活配置usernamepassworduri 等信息,更多连接配置都在options参数中

这里简单通过一些例子来配置构造函数参数,例如:

/**
 * 数据库连接
 */
const { Sequelize } = require('sequelize')

// 方法 1: 传递一个连接 URI
const sequelize1 = new Sequelize('sqlite::memory:')
const sequelize2 = new Sequelize('postgres://user:pass@142vip.cn:5432/142vip')

// 方法 2: 分别传递参数 (sqlite)
const sequelize3 = new Sequelize({
  dialect: 'sqlite',
  storage: 'path/to/database.sqlite'
})

// 方法 2: 分别传递参数 (其它数据库)
const sequelize4 = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'
})

上面的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
  }
})

从多个进程连接到数据库,则必须为每个进程创建一个实例,但每个实例都应具有最大连接池大小,以便遵守总最大大小。例如,如果您希望最大连接池大小为 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)
  });