golang编写一个类似sqlite的文件数据库实现增删改查动态改变表结构代码

代码语言:golang

所属分类:其他

代码描述:golang编写一个类似sqlite的文件数据库实现增删改查动态改变表结构代码,实现createtable、insert、update、select、delete,id自增、动态改变表结构等数据库特性,仅供学习。

代码标签: golang 编写 类似 sqlite 文件 数据库 增删 改查 代码 动态 改变 结构

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

package main
//需要在go1.16以上版本运行
import (
    "fmt"
    "os"
    "encoding/gob"
    "sync"
    "reflect"
    "bytes"
)

type Database struct {
    filename string
    tables   map[string]*Table
    mutex    sync.RWMutex
}

type Table struct {
    Name    string
    Schema  map[string]string // 使用字符串来表示类型
    Rows    []map[string]interface{}
    NextID  int
}

type SerializableDatabase struct {
    Tables map[string]*Table
}

func (db *Database) MarshalBinary() ([]byte, error) {
    sdb := SerializableDatabase{
        Tables: db.tables,
    }
    var buf bytes.Buffer
    enc := gob.NewEncoder(&buf)
    err := enc.Encode(sdb)
    return buf.Bytes(), err
}

func (db *Database) UnmarshalBinary(data []byte) error {
    var sdb SerializableDatabase
    buf := bytes.NewBuffer(data)
    dec := gob.NewDecoder(buf)
    err := dec.Decode(&sdb)
    if err != nil {
        return err
    }
    db.tables = sdb.Tables
    return nil
}

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, schema map[string]reflect.Type) error {
    db.mutex.Lock()
    defer db.mutex.Unlock()

    if _, exists := db.tables[name]; exists {
        return f.........完整代码请登录后点击上方下载按钮下载查看

网友评论0