首页 > 解决方案 > 内存中的sqlite出现“没有这样的表”错误

问题描述

我正在使用内存中的sqlite,如下所示。

func init() {
    global.ConductorConfig = readConfig()
    log.Println(utils.GetCurrentDir() + global.ConductorConfig.DbFile)
    //db = sqlx.MustConnect("sqlite3", utils.GetCurrentDir()+global.ConductorConfig.DbFile)
    db = sqlx.MustConnect("sqlite3", ":memory:")
    db.Exec(schema)
    task:=model.Task{}
    SaveTask(&task)
    db.MapperFunc(func(s string) string {
        return s
    })
}

在我的主要功能中,我创建了表格

if global.ConductorConfig.DevMode {
    db.CreateTables()
}
go job.HeartbeatJob()
go job.TaskClearJob()
app.Action = func(c *cli.Context) error {
    ListenAndServe()
    return nil
}

然后我在http处理函数中去'没有这样的表'。

existed, err := db.GetAgentByServerName(agent.ServerName)
if err != nil {
    c.JSON(http.StatusBadRequest, err)
    log.Println("[conductor] error occurred when get agent by server name: " + err.Error())
    return err
}


func GetAgentByServerName(name string) (*model.Agent, error) {
    agent := &model.Agent{}
    err := db.Get(agent, "select * from agent where ServerName=$1", name)

    if err == sql.ErrNoRows {
        err = nil
        agent = nil
    }

    return agent, err
}

当我启动程序时,我得到了

通过服务器名称获取代理时发生错误:没有这样的表:代理

db 模式(属性省略)

var schema = `
DROP TABLE IF EXISTS agent;
CREATE TABLE agent (
    Id                  INTEGER PRIMARY KEY,
);

DROP TABLE IF EXISTS task;
CREATE TABLE task (
    Id                  INTEGER PRIMARY KEY,
);

我不能分享所有代码,这里有一个重现相同错误的最小示例。

    package main

    import (
        "github.com/jmoiron/sqlx"
        _ "github.com/mattn/go-sqlite3"
        "log"
    )

    var db *sqlx.DB

    func init() {
        db = sqlx.MustConnect("sqlite3", ":memory:")
        db.Exec("CREATE TABLE agent (Id  INTEGER PRIMARY KEY,);")
    }

    func main()  {
        _, err:=db.Exec("insert into agent values (1)")
        if err!=nil{
            log.Println(err)
        }

}

标签: databasesqlitegolocking

解决方案


也许这会对某人有所帮助

我对“没有这样的桌子”有同样的问题,并找到了一个确切的解释:

如果 sql.Rows 在下一个查询之前未关闭,则驱动程序在下一个查询中不返回此类表。仅内存存储存在问题,文件支持的数据库的相同测试运行良好。

之后,我找到了我忘记做的代码部分rows.Close(),修复了它,现在它可以正常工作了。

原始答案:https ://github.com/mattn/go-sqlite3/issues/511#issuecomment-396290916


推荐阅读