146 lines
3.3 KiB
Markdown
146 lines
3.3 KiB
Markdown
## 其他包使用数据库模块
|
||
```go
|
||
package repository
|
||
|
||
import (
|
||
"your-project/database"
|
||
"your-project/log"
|
||
)
|
||
|
||
type NodeRepository struct {
|
||
db *database.DB
|
||
}
|
||
|
||
// NewNodeRepository 创建仓库(延迟连接)
|
||
func NewNodeRepository() (*NodeRepository, error) {
|
||
db, err := database.GetDB()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return &NodeRepository{db: db}, nil
|
||
}
|
||
|
||
// GetNode 获取节点(自动连接)
|
||
func (r *NodeRepository) GetNode(id int) (*Node, error) {
|
||
// 获取数据库引擎(会自动连接)
|
||
engine, err := r.db.GetEngine()
|
||
if err != nil {
|
||
return nil, fmt.Errorf("数据库连接失败: %w", err)
|
||
}
|
||
|
||
var node Node
|
||
err = engine.QueryRow("SELECT id, name FROM nodes WHERE id = ?", id).
|
||
Scan(&node.ID, &node.Name)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return &node, nil
|
||
}
|
||
|
||
// CreateNode 创建节点
|
||
func (r *NodeRepository) CreateNode(name string) error {
|
||
engine, err := r.db.GetEngine()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
_, err = engine.Exec("INSERT INTO nodes (name) VALUES (?)", name)
|
||
return err
|
||
}
|
||
```
|
||
|
||
## 服务层使用
|
||
```go
|
||
package service
|
||
|
||
import (
|
||
"your-project/repository"
|
||
"your-project/log"
|
||
)
|
||
|
||
type NodeService struct {
|
||
repo *repository.NodeRepository
|
||
}
|
||
|
||
func NewNodeService() (*NodeService, error) {
|
||
repo, err := repository.NewNodeRepository()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return &NodeService{repo: repo}, nil
|
||
}
|
||
|
||
func (s *NodeService) ListNode() error {
|
||
// 自动连接数据库
|
||
nodes, err := s.repo.GetAllNodes()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
for _, node := range nodes {
|
||
log.Infof("Node: %v", node)
|
||
}
|
||
return nil
|
||
}
|
||
```
|
||
## 命令处理
|
||
```go
|
||
package main
|
||
|
||
import (
|
||
"your-project/cmd"
|
||
"your-project/database"
|
||
"your-project/log"
|
||
"github.com/spf13/cobra"
|
||
)
|
||
|
||
func main() {
|
||
var rootCmd = &cobra.Command{Use: "sunhpc"}
|
||
|
||
// init database 命令
|
||
var initCmd = &cobra.Command{
|
||
Use: "init database",
|
||
Short: "初始化数据库",
|
||
Run: func(cmd *cobra.Command, args []string) {
|
||
force, _ := cmd.Flags().GetBool("force")
|
||
|
||
// 获取DB实例(只加载配置)
|
||
db, err := database.GetDB()
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
|
||
// 初始化schema(会根据force参数决定行为)
|
||
if err := db.InitSchema(force); err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
|
||
log.Info("数据库初始化成功")
|
||
},
|
||
}
|
||
initCmd.Flags().BoolP("force", "f", false, "强制重新初始化")
|
||
rootCmd.AddCommand(initCmd)
|
||
|
||
// node list 命令 - 自动连接已存在的数据库
|
||
var nodeCmd = &cobra.Command{
|
||
Use: "node list",
|
||
Short: "列出所有节点",
|
||
Run: func(cmd *cobra.Command, args []string) {
|
||
service, err := service.NewNodeService()
|
||
if err != nil {
|
||
log.Fatal(err) // 如果数据库不存在,这里会报错
|
||
}
|
||
|
||
if err := service.ListNode(); err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
},
|
||
}
|
||
rootCmd.AddCommand(nodeCmd)
|
||
|
||
rootCmd.Execute()
|
||
}
|
||
``` |