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可能更合适。

回到顶部