文档中心
探索 DWeb 框架的无限可能,构建下一代高性能 Web 应用
数据库模块
DWeb 框架提供了强大的数据库支持,支持 PostgreSQL 和 MongoDB,包含查询构建器、ORM/ODM、迁移管理等功能。
架构深度与优化
ORM 架构
- Active Record 模式:SQLModel 类实现了一个功能丰富的 Active Record 模式。模型类(如 User)直接拥有 find, create, update 等方法,使用直观便捷。
- 多适配器策略 (Multi-Adapter Strategy):DatabaseManager 管理多个连接,并通过 DatabaseAdapter 接口抽象了底层数据库(支持 PostgreSQL 和 MongoDB),实现了业务逻辑与数据库实现的解耦。
- 流式查询构建器 (Fluent Query Builder):SQLQueryBuilder 提供了链式调用的 API (select().from().where().join()),用于构建复杂的 SQL 查询,并自动防止 SQL 注入。
性能优化
- 自动连接管理:模型类使用 ensureInitialized 机制,只有在第一次执行查询时才建立连接或加载配置,加快了应用启动速度。
- 集成缓存层:SQLModel 直接集成了 CacheAdapter,支持在 ORM 层级配置 cacheTTL,能够自动缓存查询结果,显著减少数据库负载。
高级特性
- 软删除 (Soft Deletes):原生支持软删除逻辑(deletedAt),并提供了 withTrashed()、onlyTrashed() 和 restore() 等 API 进行全生命周期管理。
- 虚拟字段与作用域:支持 virtuals(计算属性)和 scopes(预定义查询条件),增强了模型的表达能力和代码复用性。
- 内置验证器:在 ORM 层实现了字段级的 Schema 验证(required, min, max, pattern 等),保证入库数据的完整性和一致性。
导入方式
所有数据库相关的功能都可以从 @dreamer/dweb/database 统一导入,无需从子目录导入:
使用 MySQL 时,请从 @dreamer/dweb/database/adapters/mysql 导入 MySQLAdapter。
目录结构
快速开始
初始化数据库
方式 1:使用初始化工具(推荐)
在项目入口文件(如 main.ts 或 init.ts)中调用初始化工具,自动从 dweb.config.ts 加载配置:
方式 2:手动初始化
使用 initDatabase 函数手动初始化数据库连接:
解决 "Database config loader not set" 错误
如果在使用模型时遇到 Database config loader not set 错误,需要在项目启动时设置配置加载器:
使用 ORM 模型
框架提供了强大的 ORM/ODM 功能,支持字段定义、验证、时间戳、软删除、作用域、虚拟字段、生命周期钩子等特性。
SQLModel 完整示例
以下是一个完整的 SQLModel 示例,展示了所有特性:
使用示例
使用 User 模型的各种方法:
MongoModel 完整示例
MongoDB 模型示例,支持地理空间查询和聚合查询:
数据库适配器
PostgreSQL 适配器
PostgreSQL 适配器支持连接池、事务、查询构建等功能:
MongoDB 适配器
MongoDB 适配器支持文档查询、聚合、索引等功能:
MySQL 适配器
MySQL/MariaDB 适配器支持基本查询、执行、事务与自动重连:
ORM/ODM 模型
模型特性
- 字段定义和类型验证
- 自动时间戳管理
- 软删除支持
- 查询作用域
- 虚拟字段
- 生命周期钩子
- 关联查询(一对一、一对多、多对多)
- 索引管理
- 查询缓存
关联查询
关联查询用于处理模型之间的关系,支持一对一、一对多和多对一关系。
关联方法
**belongsTo(RelatedModel, foreignKey, localKey?)** - 属于关系(多对一)
例如:Post belongsTo User(一个帖子属于一个用户)
- RelatedModel: 关联的模型类
- foreignKey: 外键字段名(当前模型中的字段)
- localKey: 关联模型的主键字段名(默认为关联模型的 primaryKey)
**hasOne(RelatedModel, foreignKey, localKey?)** - 有一个关系(一对一)
例如:User hasOne Profile(一个用户有一个资料)
- foreignKey: 外键字段名(关联模型中的字段)
- localKey: 当前模型的主键字段名(默认为当前模型的 primaryKey)
**hasMany(RelatedModel, foreignKey, localKey?)** - 有多个关系(一对多)
例如:User hasMany Posts(一个用户有多个帖子)
- foreignKey: 外键字段名(关联模型中的字段)
- localKey: 当前模型的主键字段名(默认为当前模型的 primaryKey)
完整示例
查询构建器
SQL 查询构建器
使用查询构建器可以方便地构建复杂的 SQL 查询:
MongoDB 查询构建器
MongoDB 查询构建器支持文档查询:
数据库迁移
使用 MigrationManager 管理数据库迁移:
查询缓存
框架支持查询缓存,可以显著提高查询性能:
查询日志
使用 QueryLogger 记录和监控数据库查询:
连接池监控
监控数据库连接池的状态,了解连接使用情况:
健康检查
执行数据库健康检查,确保数据库连接正常:
API 参考
模型方法
查询方法
find(condition, fields?)- 查找单条记录findAll(condition?, fields?)- 查找多条记录findById(id, fields?)- 根据 ID 查找findOne(condition, fields?)- 查找一条记录count(condition?)- 统计数量exists(condition)- 检查是否存在paginate(condition, page, pageSize)- 分页查询
创建方法
create(data)- 创建单条记录createMany(data[])- 批量创建
更新方法
update(condition, data)- 更新记录(静态方法)update(data)- 更新当前实例(实例方法)updateById(id, data)- 通过主键 ID 更新记录(静态方法)updateMany(condition, data)- 批量更新increment(condition, field, amount)- 递增字段(静态方法)decrement(condition, field, amount)- 递减字段(静态方法)findOneAndUpdate(condition, data)- 查找并更新(仅 MongoDB)
删除方法
delete(condition)- 删除记录(静态方法)deleteById(id)- 通过主键 ID 删除记录(静态方法)delete()- 删除当前实例(实例方法)deleteMany(condition)- 批量删除findOneAndDelete(condition)- 查找并删除(仅 MongoDB)
软删除相关方法
restore(condition)- 恢复软删除的记录(静态方法)forceDelete(condition)- 强制删除记录,忽略软删除(静态方法)withTrashed()- 查询时包含已软删除的记录(静态方法,返回查询构建器)onlyTrashed()- 只查询已软删除的记录(静态方法,返回查询构建器)
其他方法
upsert(condition, data)- 更新或插入findOrCreate(condition, data)- 查找或创建(如果不存在则创建)distinct(field, condition?)- 去重查询aggregate(pipeline)- 聚合查询(仅 MongoDB)truncate()- 清空表/集合(删除所有记录)save()- 保存当前实例(实例方法)reload()- 重新加载当前实例(实例方法)
查询作用域方法
scope(scopeName)- 应用查询作用域(静态方法,返回查询构建器)
返回的查询构建器支持 findAll(), find(), count() 方法
初始化方法
init(connectionName?)- 初始化模型,设置数据库适配器并创建索引(静态方法)
connectionName: 连接名称,默认为 'default'。如果数据库未初始化,会自动尝试从 dweb.config.ts 加载配置并初始化。
关联查询方法(实例方法)
belongsTo(RelatedModel, foreignKey, localKey?)- 属于关系(多对一)hasOne(RelatedModel, foreignKey, localKey?)- 有一个关系(一对一)hasMany(RelatedModel, foreignKey, localKey?)- 有多个关系(一对多)
索引管理
createIndexes()- 创建索引createIndexes(true)- 强制重新创建索引dropIndexes()- 删除所有索引getIndexes()- 获取所有索引