为了账号安全,请及时绑定邮箱和手机立即绑定

内存中的 sqlite 出现“没有这样的表”错误

内存中的 sqlite 出现“没有这样的表”错误

Go
慕桂英3389331 2023-04-04 14:35:17
我正在使用内存中的 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}当我启动程序时,我得到了按服务器名称获取代理时出错:没有这样的表:代理数据库模式(省略属性)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)        }}
查看完整描述

4 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

:memory:将为每个连接打开一个单独的数据库。改用file::memory:?cache=shared

更新:我在使用上面的代码时也遇到了一些锁定问题,在我看来,在测试中使用:memory:with是一个更好的解决方案。db.DB().SetMaxOpenConns(1)


查看完整回答
反对 回复 2023-04-04
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

也许这会帮助某人

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

如果 sql.Rows 在下一个查询之前没有关闭,那么驱动程序在下一个查询时不会返回这样的表。问题仅存在于内存存储中,文件支持的数据库的相同测试运行良好。

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


查看完整回答
反对 回复 2023-04-04
?
Helenr

TA贡献1780条经验 获得超3个赞

如果您使用与在此处发布的表相同的模式创建表,则永远不会创建该表,因为该模式有语法错误,它应该是这样的


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

);

`

我猜你的代码与示例代码相同,所以在 init 函数中你跳过了错误检查db.Exec(schema)(你永远不应该对 中的任何函数这样做Go)。由于未检查错误并且执行模式时出错,因此永远不会创建表但程序继续,请更正您的模式并检查错误然后重试。在你的初始化函数中试试这个:


_, err := db.Exec(schema)


if err != nil {

    log.Fatal(err)


查看完整回答
反对 回复 2023-04-04
?
www说

TA贡献1775条经验 获得超8个赞

当我尝试使用错误的事务时,出现“内存中 sqlite 没有这样的表”错误。例子:


tx, err = DB.Begin()

if err != nil {

    ErrorStatus = true

    goto ErrorLabel

}

tempQuery = "INSERT INTO msg_to_like (msg_id, user_id) " +

    "VALUES ('" + nmbr + "', " + usr + ");"

fmt.Println(tempQuery)

if _, err = DB.Exec(tempQuery); err != nil {

    ErrorStatus = true

    goto ErrorLabel

}

...

但有必要:


if _, err = tx.Exec(tempQuery); err != nil {

出现此错误后,使用的表崩溃了。


查看完整回答
反对 回复 2023-04-04
  • 4 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信