最稳起点是直接用database/sql+官方驱动;sql.Open仅初始化连接池,需db.PingContext验证连通性;MySQL连接串须加parseTime=True&loc=Local;推荐设SetMaxOpenConns(20)、SetMaxIdleConns(10)、SetConnMaxLifetime(60s)。

直接用 database/sql + 驱动是最稳的起点
Kratos 本身不强制绑定 ORM,database/sql 是 Go 标准库,兼容所有 MySQL 驱动(如 github.com/go-sql-driver/mysql),启动快、无隐式行为、出错时堆栈清晰。新手一上来就集成 GORM 或 ent,反而容易卡在连接池复用、事务嵌套、日志干扰等细节上。
关键点:
-
sql.Open只是初始化连接池,**不会真正建连**;必须调用db.PingContext才能验证连通性 - MySQL 连接字符串里要显式加
parseTime=True&loc=Local,否则time.Time字段会解析失败或变成零值 - 推荐设置连接池参数:
db.SetMaxOpenConns(20)、db.SetMaxIdleConns(10)、db.SetConnMaxLifetime(60 * time.Second),避免连接泄漏或僵死
kratos-gorm-example 项目里怎么配 GORM
如果你已经决定用 GORM(比如需要软删除、钩子、预加载等特性),别自己从零写初始化逻辑——直接参考社区验证过的 kratos-gorm-example 结构。
实操要点:
-
数据库配置项必须放在
config.yaml的data.database下,Kratos 的config.New才能自动注入到 GORM 初始化函数中 - GORM 的
gorm.Open要传&gorm.Config{NowFunc: func() time.Time { return time.Now().In(time.Local) }},否则软删除时间字段可能写入 UTC 导致查询异常 - 别在
func NewUserRepo(db *gorm.DB)里直接用db.Unscoped(),应该封装成方法,比如r.db.WithContext(ctx).Unscoped().First(...),确保上下文透传
MySQL 连不上?先查这三件事
90% 的“Kratos 连不上 MySQL”问题,和 Kratos 无关,是基础环境没对齐。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
快速排查清单:
- 确认 MySQL 服务已运行:
systemctl status mysqld(Linux)或服务管理器里看MySQL80是否启动 - 检查连接串里的
host:本地开发用127.0.0.1,别用localhost(Unix socket 路径可能不一致,尤其 Docker 场景) - 验证用户权限:
SELECT Host, User FROM mysql.user WHERE User = 'root';,如果只返回localhost,远程连接就会被拒;补一句CREATE USER 'kratos'@'%' IDENTIFIED BY 'xxx'; GRANT ALL ON *.* TO 'kratos'@'%'; FLUSH PRIVILEGES;
配置文件里写密码,安全吗?
开发阶段写明文密码在 config.yaml 里没问题,但上线前必须切走——Kratos 支持多源配置,优先级规则决定了你可以用环境变量覆盖它。
例如:
- 配置文件保留默认值:
password: "dev_password" - 启动时加环境变量:
DATA_DATABASE_PASSWORD=prod_secret ./server -conf configs/config.yaml - Kratos 会按
file.NewSource → env.NewSource顺序加载,后者的同名 key 自动覆盖前者
真正容易被忽略的是:环境变量 key 必须和 YAML 中的嵌套路径完全匹配,比如 data.database.password 对应的环境变量名是 DATA_DATABASE_PASSWORD,大小写和下划线都不能错。










