本文档描述了 Gitea 使用的数据库系统。它涵盖了架构、支持的数据库类型、配置选项、连接管理、事务处理、迁移系统和查询模式。有关迁移的具体信息,请参阅迁移系统。
Gitea 开箱即用地支持四种数据库系统
| 数据库类型 | 配置名称 | 备注 |
|---|---|---|
| MySQL/MariaDB | mysql | 推荐用于生产环境 |
| PostgreSQL | postgres | 性能良好且功能支持全面 |
| Microsoft SQL Server | mssql | 适用于面向 Windows 的环境 |
| SQLite3 | sqlite3 | 使用相应的标志构建时启用 |
来源:modules/setting/database.go19-22 modules/setting/database.go211-225
Gitea 的数据库层遵循多层架构,它抽象了不同数据库后端上的数据库操作。
来源:modules/setting/database.go models/db/engine.go models/db/context.go models/migrations/migrations.go
数据库配置通过 app.ini 文件中的设置进行管理,并通过 modules/setting 包加载。
来源:modules/setting/database.go26-52
数据库连接字符串是根据数据库类型构建的
来源:modules/setting/database.go94-136
Gitea 使用 XORM 作为其对象关系映射 (ORM) 层。引擎通过 Engine 接口进行抽象。
Engine 接口提供了常用的数据库操作方法
模型使用 RegisterModel 函数与引擎进行注册
Gitea 使用基于上下文的方法进行数据库操作,这提供了一种管理事务的一致方式。
Context 类型包装了一个标准的 Go context 并包含一个引擎
GetEngine 函数从上下文中检索现有引擎或创建一个新引擎
Gitea 提供了两种事务管理方法
来源:models/db/context.go153-193
使用 TxContext 时
Commit(),完成后始终调用 Close()Commit()Commit() 可能什么都不做使用 WithTx 时
来源:models/db/context.go144-152
Gitea 为常见的数据库操作提供了辅助函数。
来源:models/db/context.go195-239
Gitea 为不同的用例使用了多种查询模式
来源:models/db/context.go261-350
迁移系统管理着 Gitea 随时间推移的数据库模式变更。
每次迁移由以下内容定义:
来源:models/migrations/migrations.go39-45
当前数据库版本存储在 Version 表中
来源:models/migrations/migrations.go57-61
来源:models/migrations/migrations.go
迁移在 prepareMigrationTasks 函数中注册,按 Gitea 版本组织
来源:models/migrations/migrations.go71-327
Gitea 的数据库模型被定义为 Go 结构体,并带有 XORM 标签,这些标签映射到数据库表。
模型经常使用外键相互引用。例如:
Gitea 包含检查和更正数据库统计信息的功能,以确保一致性。
CheckRepoStats 函数验证并更正各种仓库统计信息
数据库配置包含几个用于优化的参数
MaxIdleConns:控制连接池中最大空闲连接数MaxOpenConns:限制到数据库的打开连接总数ConnMaxLifetime:设置连接可重用的最长时间SlowQueryThreshold:确定何时将查询记录为“慢查询”来源:modules/setting/database.go78-91
Gitea 的数据库系统提供了一个灵活而强大的基础,可跨多个数据库后端进行持久化数据存储。采用 XORM 作为 ORM 层,并结合基于上下文的事务处理方式,其分层架构能够支持不同类型的数据库,同时保证代码的整洁性和可维护性。
迁移系统确保数据库模式能够与应用程序代码同步演进,从而更轻松地维护和升级 Gitea 的安装。有关迁移系统的具体信息,请参阅 迁移系统。