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