菜单

数据库系统

相关源文件

本文档描述了 Gitea 使用的数据库系统。它涵盖了架构、支持的数据库类型、配置选项、连接管理、事务处理、迁移系统和查询模式。有关迁移的具体信息,请参阅迁移系统

支持的数据库类型

Gitea 开箱即用地支持四种数据库系统

数据库类型配置名称备注
MySQL/MariaDBmysql推荐用于生产环境
PostgreSQLpostgres性能良好且功能支持全面
Microsoft SQL Servermssql适用于面向 Windows 的环境
SQLite3sqlite3使用相应的标志构建时启用

来源: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 接口提供了常用的数据库操作方法

来源:models/db/engine.go28-62

模型注册

模型使用 RegisterModel 函数与引擎进行注册

来源:models/db/engine.go70-75

基于上下文的数据库操作

Gitea 使用基于上下文的方法进行数据库操作,这提供了一种管理事务的一致方式。

数据库上下文

Context 类型包装了一个标准的 Go context 并包含一个引擎

来源:models/db/context.go28-48

从上下文获取引擎

GetEngine 函数从上下文中检索现有引擎或创建一个新引擎

来源:models/db/context.go93-98

事务管理

Gitea 提供了两种事务管理方法

  1. TxContext:手动事务管理
  2. WithTx:自动事务管理

来源:models/db/context.go153-193

事务最佳实践

使用 TxContext

  1. 无论是否调用了 Commit(),完成后始终调用 Close()
  2. 如果没有错误,请在返回前调用 Commit()
  3. 请注意,如果事务正在被重用,Commit() 可能什么都不做

使用 WithTx

  1. 如果函数返回 nil,事务将自动提交
  2. 如果函数返回错误,事务将自动回滚

来源:models/db/context.go144-152

数据库操作

Gitea 为常见的数据库操作提供了辅助函数。

基本操作

来源:models/db/context.go195-239

查询模式

Gitea 为不同的用例使用了多种查询模式

来源:models/db/context.go261-350

迁移系统

迁移系统管理着 Gitea 随时间推移的数据库模式变更。

迁移结构

每次迁移由以下内容定义:

  • 一个 ID 号
  • 一个描述
  • 一个迁移函数

来源: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 函数验证并更正各种仓库统计信息

  • 关注者数量
  • 星标数量
  • 问题数量
  • 已关闭问题数量
  • 拉取请求数量
  • 已关闭的拉取请求数量
  • Fork 数量

来源:models/repo.go140-268

数据库性能注意事项

数据库配置包含几个用于优化的参数

  • MaxIdleConns:控制连接池中最大空闲连接数
  • MaxOpenConns:限制到数据库的打开连接总数
  • ConnMaxLifetime:设置连接可重用的最长时间
  • SlowQueryThreshold:确定何时将查询记录为“慢查询”

来源:modules/setting/database.go78-91

结论

Gitea 的数据库系统提供了一个灵活而强大的基础,可跨多个数据库后端进行持久化数据存储。采用 XORM 作为 ORM 层,并结合基于上下文的事务处理方式,其分层架构能够支持不同类型的数据库,同时保证代码的整洁性和可维护性。

迁移系统确保数据库模式能够与应用程序代码同步演进,从而更轻松地维护和升级 Gitea 的安装。有关迁移系统的具体信息,请参阅 迁移系统