Ошибка "нет такой таблицы" с sqlite в памяти - PullRequest
0 голосов
/ 13 сентября 2018

Я использую 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)
        }

}

Ответы [ 2 ]

0 голосов
/ 24 января 2019

У меня возникла ошибка «нет такой таблицы с 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 {

После этой ошибки произошел сбой используемых таблиц.

0 голосов
/ 13 сентября 2018

Если вы использовали ту же схему для создания таблицы, которую вы разместили здесь, то таблица никогда не будет создана, потому что в схеме есть синтаксическая ошибка, и она должна быть такой:

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)
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...