Golang中基于pkgsite项目架构的GORM模型实现
Golang中基于pkgsite项目架构的GORM模型实现
你好。我想使用 https://github.com/golang/pkgsite 项目的架构。我已经基本实现了它,但我不知道如何为使用 GORM 的各种模型(用于添加、获取或更新)做出正确的实现。在这个架构中,所有模型都存储在 internal/discovery.go 文件中。有什么想法吗?
我应该使用这个架构,还是例如使用 https://github.com/bxcodec/go-clean-arch 会更好?
更多关于Golang中基于pkgsite项目架构的GORM模型实现的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang中基于pkgsite项目架构的GORM模型实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在pkgsite架构中,internal/discovery.go主要处理模块发现逻辑,而非数据模型存储。对于GORM模型实现,建议参考pkgsite的internal/database包结构。
以下是基于pkgsite架构的GORM模型实现示例:
// internal/models/user.go
package models
import (
"gorm.io/gorm"
"time"
)
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
Email string `gorm:"uniqueIndex;size:255"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
// internal/database/repository/user_repository.go
package repository
import (
"context"
"yourproject/internal/models"
"gorm.io/gorm"
)
type UserRepository struct {
db *gorm.DB
}
func NewUserRepository(db *gorm.DB) *UserRepository {
return &UserRepository{db: db}
}
func (r *UserRepository) Create(ctx context.Context, user *models.User) error {
return r.db.WithContext(ctx).Create(user).Error
}
func (r *UserRepository) FindByID(ctx context.Context, id uint) (*models.User, error) {
var user models.User
err := r.db.WithContext(ctx).First(&user, id).Error
return &user, err
}
func (r *UserRepository) Update(ctx context.Context, user *models.User) error {
return r.db.WithContext(ctx).Save(user).Error
}
// internal/database/database.go
package database
import (
"gorm.io/driver/postgres"
"gorm.io/gorm"
"yourproject/internal/config"
)
func NewDB(cfg *config.Config) (*gorm.DB, error) {
db, err := gorm.Open(postgres.Open(cfg.DatabaseURL), &gorm.Config{})
if err != nil {
return nil, err
}
// 自动迁移模型
err = db.AutoMigrate(&models.User{})
return db, err
}
// internal/postgres/postgres.go (类似pkgsite的实现方式)
package postgres
import (
"context"
"database/sql"
"fmt"
"yourproject/internal/models"
)
type DB struct {
*sql.DB
}
func NewDB(dataSourceName string) (*DB, error) {
db, err := sql.Open("postgres", dataSourceName)
if err != nil {
return nil, err
}
return &DB{db}, nil
}
func (db *DB) InsertUser(ctx context.Context, u *models.User) error {
query := `INSERT INTO users (name, email, created_at)
VALUES ($1, $2, $3)
RETURNING id`
return db.QueryRowContext(ctx, query, u.Name, u.Email, u.CreatedAt).Scan(&u.ID)
}
// cmd/yourproject/main.go
package main
import (
"yourproject/internal/config"
"yourproject/internal/database"
"yourproject/internal/database/repository"
)
func main() {
cfg := config.Load()
db, err := database.NewDB(cfg)
if err != nil {
panic(err)
}
userRepo := repository.NewUserRepository(db)
// 使用示例
ctx := context.Background()
user := &models.User{
Name: "John Doe",
Email: "john@example.com",
}
err = userRepo.Create(ctx, user)
if err != nil {
// 处理错误
}
}
关于架构选择,pkgsite架构适合需要处理Go模块和包发现的项目,而go-clean-arch提供了更通用的整洁架构实现。如果项目主要涉及Go模块分析,使用pkgsite架构;如果需要更通用的业务应用架构,go-clean-arch可能更合适。

