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()
|
|||
|
|
}
|
|||
|
|
```
|