golang编写一个类似sqlite的文件数据库实现增删改查代码
代码语言:golang
所属分类:其他
代码描述:golang编写一个类似sqlite的文件数据库实现增删改查代码,实现createtable、insert、update、select、delete,id自增等数据库特性,仅供学习。
代码标签: golang 编写 类似 sqlite 文件 数据库 增删 改查 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
package main
import (
"fmt"
"os"
"encoding/gob"
"sync"
"errors"
)
type Database struct {
filename string
tables map[string]*Table
mutex sync.RWMutex
}
type Table struct {
Name string
Columns []string
Rows [][]interface{}
NextID int // 用于跟踪下一个可用的 ID
}
func NewDatabase(filename string) *Database {
db := &Database{
filename: filename,
tables: make(map[string]*Table),
}
err := db.Load()
if err != nil && !os.IsNotExist(err) {
fmt.Printf("警告: 加载数据库失败: %v\n", err)
}
return db
}
func (db *Database) CreateTable(name string, columns []string) error {
db.mutex.Lock()
defer db.mutex.Unlock()
if _, exists := db.tables[name]; exists {
return fmt.Errorf("表 %s 已存在", name)
}
db.tables[name] = &Table{
Name: name,
Columns: append([]string{"id"}, columns...), // 添加 ID 列
Rows: make([][]interface{}, 0),
NextID: 1, // 初始化 NextID
}
return db.Save()
}
func (db *Database) Insert(tableName string, values []interface{}) error {
db.mutex.Lock()
defer db.mutex.Unlock()
table, exists := db.tables[tableName]
if !exists {
return fmt.Errorf("表 %s 不存在", tableName)
}
if len(values)+1 != len(table.Columns) { // +1 是因为我们会自动添加 ID
return fmt.Errorf("值的数量无效")
}
// 添加自动递增的 ID
newRow := append([]interface{}{table.NextID}, values...)
table.Rows = append(table.Rows, newRow)
table.NextID++
return db.Save()
}
func (db *Database) Update(tableName string, id int, updateFunc func([]interface{}) []interface{}) error {
db.mutex.Lock()
.........完整代码请登录后点击上方下载按钮下载查看
网友评论0