errors when using cacher and session #1352

Closed
opened 2019-07-10 06:57:24 +00:00 by guangfnian · 2 comments
guangfnian commented 2019-07-10 06:57:24 +00:00 (Migrated from github.com)

I'm using sqlite3, my database is like

drop table if exists a;
create table if not exists a
(
    name  text primary key,
    value integer
);

drop table if exists b;

create table if not exists b
(
    id integer primary key autoincrement,
    name references a (name) on delete cascade on update cascade
);

and my golang code is here:

package main

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

type A struct {
	Name string `xorm:"text pk"`
	Value int `xorm:"integer"`
}

type B struct {
	Id int64
	Name string `xorm:"text"`
}

func createData(engine *xorm.Engine) {
	_, err := engine.InsertOne(&A{Name:"test", Value:233})
	if err != nil {
		log.Fatal("insert a", err)
	}
	_, err = engine.InsertOne(&B{Id:1, Name:"test"})
	if err != nil {
		log.Fatal("insert b", err)
	}
}

func main() {
	engine, err := xorm.NewEngine("sqlite3", "test.db?_foreign_keys=on")
	if err != nil {
		panic(err)
	}
	cacher := xorm.NewLRUCacher(xorm.NewMemoryStore(), 1000)
	engine.SetDefaultCacher(cacher)
	//createData(engine)

	session := engine.NewSession()

	nodeId := int64(1)

	b := &B{}
	has, err := session.ID(nodeId).Get(b)
	if err != nil {
		log.Fatal("select b err, ", err)
	}
	if !has {
		log.Fatal("b not exists")
	}

	a := &A{}
	has, err = session.Where("name=?", b.Name).Get(a)
	if err != nil {
		log.Fatal("select a err, ", err)
	}
	if !has {
		log.Fatal("a not exists")
	}

	log.Println(a)

	// ====  repeat to use cache
	b = &B{}
	has, err = session.ID(nodeId).Get(b)
	if err != nil {
		log.Fatal("select b err, ", err)
	}
	if !has {
		log.Fatal("b not exists")
	}

	a = &A{}
	has, err = session.Where("name=?", b.Name).Get(a)
	if err != nil {
		log.Fatal("select a err, ", err)
	}
	if !has {
		log.Fatal("a not exists")
	}
	log.Println(a)
}

and the result of this program is like that:

2019/07/10 14:44:10 &{test 233}
2019/07/10 14:44:10 select a err, no such column: id

session with NoCache() runs into the same error

has, err = session.NoCache().Where("name=?", b.Name).Get(a)

but if i don't set cacher, or if i use engine instead of session, the program just works fine.

I'm using sqlite3, my database is like ```sql drop table if exists a; create table if not exists a ( name text primary key, value integer ); drop table if exists b; create table if not exists b ( id integer primary key autoincrement, name references a (name) on delete cascade on update cascade ); ``` and my golang code is here: ```go package main import ( "github.com/go-xorm/xorm" _ "github.com/mattn/go-sqlite3" "log" ) type A struct { Name string `xorm:"text pk"` Value int `xorm:"integer"` } type B struct { Id int64 Name string `xorm:"text"` } func createData(engine *xorm.Engine) { _, err := engine.InsertOne(&A{Name:"test", Value:233}) if err != nil { log.Fatal("insert a", err) } _, err = engine.InsertOne(&B{Id:1, Name:"test"}) if err != nil { log.Fatal("insert b", err) } } func main() { engine, err := xorm.NewEngine("sqlite3", "test.db?_foreign_keys=on") if err != nil { panic(err) } cacher := xorm.NewLRUCacher(xorm.NewMemoryStore(), 1000) engine.SetDefaultCacher(cacher) //createData(engine) session := engine.NewSession() nodeId := int64(1) b := &B{} has, err := session.ID(nodeId).Get(b) if err != nil { log.Fatal("select b err, ", err) } if !has { log.Fatal("b not exists") } a := &A{} has, err = session.Where("name=?", b.Name).Get(a) if err != nil { log.Fatal("select a err, ", err) } if !has { log.Fatal("a not exists") } log.Println(a) // ==== repeat to use cache b = &B{} has, err = session.ID(nodeId).Get(b) if err != nil { log.Fatal("select b err, ", err) } if !has { log.Fatal("b not exists") } a = &A{} has, err = session.Where("name=?", b.Name).Get(a) if err != nil { log.Fatal("select a err, ", err) } if !has { log.Fatal("a not exists") } log.Println(a) } ``` and the result of this program is like that: ``` 2019/07/10 14:44:10 &{test 233} 2019/07/10 14:44:10 select a err, no such column: id ``` session with NoCache() runs into the same error ```go has, err = session.NoCache().Where("name=?", b.Name).Get(a) ``` but if i don't set cacher, or if i use engine instead of session, the program just works fine.
guangfnian commented 2019-07-11 05:47:42 +00:00 (Migrated from github.com)

i have solved this problem. when method like session.cacheGet() hit the cache, session.resetStatement() won't be called.

So my solution is add defer session.resetStatement() statement at the beginning at method like session.cacheGet()

i have solved this problem. when method like session.cacheGet() hit the cache, session.resetStatement() won't be called. So my solution is add `defer session.resetStatement()` statement at the beginning at method like session.cacheGet()

@guangfnian could you send a PR to fix that?

@guangfnian could you send a PR to fix that?
Sign in to join this conversation.
No Milestone
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: xorm/xorm#1352
No description provided.