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