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() defer db.mutex.Unlock() table, exists := db.tables[tableName] if !exists { return fmt.Errorf("表 %s 不存在", tableName) } for i, row := range table.Rows { if rowID, ok := row[0].(int); ok && rowID == id { updatedRow := updateFunc(row[1:]) // 不包括 ID if len(updatedRow)+1 != len(table.Columns) { return fmt.Errorf("更新后的值数量无效") } table.Rows[i] = append([]interface{}{id}, updatedRow...) return db.Save() } } return errors.New("没有找到匹配的记录") } func (db *Database) Delete(tableName string, id int) error { db.mutex.Lock() defer db.mutex.Unlock() table, exists := db.tables[tableName] if !exists { return fmt.Errorf("表 %s 不存在", tableName) } for i, row := range table.Rows { if rowID, ok := row[0].(.........完整代码请登录后点击上方下载按钮下载查看
网友评论0