pg-promise 数据库连接库使用指南
pg-promise PostgreSQL interface for Node.js 项目地址: https://gitcode.com/gh_mirrors/pg/pg-promise
概述
pg-promise 是一个基于 Promise 的 PostgreSQL 数据库接口库,为 Node.js 应用程序提供了高效、灵活的数据库操作能力。相比传统的回调方式,它采用 Promise 模式,使异步代码更易于编写和维护。
安装与初始化
安装
使用 npm 包管理器安装 pg-promise:
npm install pg-promise
初始化
初始化 pg-promise 有两种方式:
- 带初始化选项的方式:
const initOptions = {
// 这里可以配置各种初始化选项
capSQL: true, // 自动将 SQL 转换为大写
promiseLib: require('bluebird') // 使用 Bluebird 作为 Promise 实现
};
const pgp = require('pg-promise')(initOptions);
- 不带初始化选项的简单方式:
const pgp = require('pg-promise')();
初始化选项是可选的,但通过它们可以配置库的各种行为,如查询格式化、Promise 实现、错误处理等。
创建数据库连接
创建数据库连接对象是使用 pg-promise 的核心步骤:
const db = pgp(connection);
其中 connection
参数可以是:
- 配置对象:包含 host、port、database、user、password 等属性
- 连接字符串:格式如
postgres://user:password@host:port/database
db
对象实现了懒连接模式,只有在实际执行查询时才会建立连接,查询完成后自动释放连接。因此,对于同一组连接参数,应该只创建一个全局共享的 db
实例。
最佳实践是在单独的模块中初始化和导出 db
对象,这样可以在整个应用中复用。
核心功能
数据库操作
pg-promise 提供了丰富的数据库操作方法:
db.any(query, values)
- 执行查询并返回所有结果db.one(query, values)
- 执行查询并期望返回单行结果db.none(query, values)
- 执行不返回结果的查询db.many(query, values)
- 执行查询并期望返回多行结果db.result(query, values)
- 执行查询并返回完整的结果对象
事务管理
pg-promise 提供了强大的事务支持:
db.tx(t => {
return t.one('INSERT INTO users(name) VALUES($1) RETURNING id', ['John'])
.then(user => {
return t.none('INSERT INTO logs(event, user_id) VALUES($1, $2)',
['created', user.id]);
});
})
.then(data => {
// 事务成功提交
})
.catch(error => {
// 事务回滚
});
高级查询功能
- 查询文件(QueryFile):将 SQL 查询存储在外部文件中,便于管理和重用
- 预处理语句(PreparedStatement):提高重复查询的性能
- 参数化查询(ParameterizedQuery):安全地处理用户输入
- 批量操作:高效执行批量插入/更新操作
最佳实践
- 连接管理:避免频繁创建和销毁连接,使用连接池
- 错误处理:统一处理数据库错误,避免 Promise 链断裂
- SQL 注入防护:始终使用参数化查询,不要拼接 SQL 字符串
- 性能监控:利用查询事件进行性能分析和优化
- 类型安全:为复杂查询定义返回类型,提高代码可维护性
常见问题解决方案
- 连接泄漏:确保所有查询都正确处理 Promise,避免未释放的连接
- 长事务:设置合理的事务超时时间,避免锁竞争
- 连接池耗尽:调整连接池大小,优化查询性能
- 数据类型转换:使用自定义类型格式化处理特殊数据类型
总结
pg-promise 通过 Promise 接口简化了 PostgreSQL 数据库操作,提供了事务管理、查询格式化、类型安全等高级功能。遵循本文介绍的最佳实践,可以构建高效、可靠的数据库访问层。对于更复杂的用例,建议参考官方文档中的示例和详细说明。
pg-promise PostgreSQL interface for Node.js 项目地址: https://gitcode.com/gh_mirrors/pg/pg-promise
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考