/
esqlite.go
115 lines (101 loc) · 2.51 KB
/
esqlite.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// Package esqlite Description: sqlite数据库操作封装
package esqlite
import (
"fmt"
"github.com/glebarez/sqlite"
"gorm.io/gorm"
)
type ESqliteI interface {
E打开数据库(数据库文件 string) error
E打开内存数据库() error
E关闭数据库() error
E执行SQL(命令 string) error
E执行查询SQL(命令 string) ([]map[string]interface{}, error)
E执行事务(f func(tx *gorm.DB) error) error
}
type ESqlite struct {
ESqliteI
db *gorm.DB
}
func NewESqlite() *ESqlite {
return &ESqlite{
db: nil,
}
}
func (e *ESqlite) E打开数据库(数据库文件 string) error {
var err error
e.db, err = gorm.Open(sqlite.Open(数据库文件), &gorm.Config{})
if err != nil {
return fmt.Errorf("无法打开数据库: %w", err)
}
return nil
}
func (e *ESqlite) E打开内存数据库() error {
var err error
e.db, err = gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
if err != nil {
return fmt.Errorf("无法打开内存数据库: %w", err)
}
return nil
}
func (e *ESqlite) E关闭数据库() error {
var err error
sqlDB, err := e.db.DB()
err = sqlDB.Close()
if err != nil {
return fmt.Errorf("无法关闭数据库: %w", err)
}
return nil
}
func (e *ESqlite) E执行SQL(命令 string) error {
result := e.db.Exec(命令)
if result.Error != nil {
return fmt.Errorf("执行SQL失败: %w", result.Error)
}
return nil
}
func (e *ESqlite) E执行查询SQL(命令 string) ([]map[string]interface{}, error) {
rows, err := e.db.Raw(命令).Rows()
if err != nil {
return nil, fmt.Errorf("执行查询SQL失败: %w", err)
}
defer rows.Close()
columns, err := rows.Columns()
if err != nil {
return nil, fmt.Errorf("获取列名失败: %w", err)
}
values := make([]interface{}, len(columns))
scanArgs := make([]interface{}, len(values))
for i := range values {
scanArgs[i] = &values[i]
}
results := []map[string]interface{}{}
for rows.Next() {
err = rows.Scan(scanArgs...)
if err != nil {
return nil, fmt.Errorf("扫描行失败: %w", err)
}
resultMap := map[string]interface{}{}
for k, v := range values {
key := columns[k]
value := ""
switch v := v.(type) {
case []byte:
value = string(v)
default:
value = fmt.Sprintf("%v", v)
}
resultMap[key] = value
}
results = append(results, resultMap)
}
if err := rows.Err(); err != nil {
return nil, fmt.Errorf("读取行失败: %w", err)
}
return results, nil
}
func (e *ESqlite) E执行事务(f func(tx *gorm.DB) error) error {
return e.db.Transaction(func(tx *gorm.DB) error {
return f(tx)
})
}