uptrace / bun

SQL-first Golang ORM

Home Page:https://bun.uptrace.dev

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

inconsistent behavior for ModelTableExpr (select <--> create/insert/update/delete)

mingoal opened this issue · comments

bun@v1.1.17

bun allows using ModelTableExpr to rename table, insert/update could operate on renamed table, but query_select doesn't support to select from it.

I raised #965 but it was closed.

From the tracing log, select ignored the parameter of ModelTableExpr when constructing the sql statement.

[bun]  08:16:07.856   CREATE TABLE          1.421ms  CREATE TABLE renamed_table_name ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "name" VARCHAR)
[bun]  08:16:07.856   INSERT                  168µs  INSERT INTO renamed_table_name ("name") VALUES ('admin') RETURNING "id"
[bun]  08:16:07.856   UPDATE                   86µs  UPDATE renamed_table_name SET "name" = 'root' WHERE (id = 1)
[bun]  08:16:07.857   SELECT                   32µs  SELECT "user"."id", "user"."name" FROM renamed_table_name WHERE (id = 1)     *sqlite.Error: SQL logic error: no such column: user.id (1) 
Fail to select user  SQL logic error: no such column: user.id (1)
[bun]  08:16:07.857   DELETE                   80µs  DELETE FROM renamed_table_name WHERE (id = 1 )
func DemoBunOperation() {
	sqldb, err := sql.Open(sqliteshim.ShimName, "file::memory:?cache=shared")
	if err != nil {
		panic(err)
	}

	db := bun.NewDB(sqldb, sqlitedialect.New())

	db.AddQueryHook(bundebug.NewQueryHook(
		bundebug.WithVerbose(true),
		bundebug.FromEnv("BUNDEBUG"),
	))

	ctx := context.Background()
	type User struct {
		bun.BaseModel

		ID   int64 `bun:",pk,autoincrement"`
		Name string
	}

	renamedTable := "renamed_table_name"
	db.NewCreateTable().Model((*User)(nil)).ModelTableExpr(renamedTable).Exec(ctx)
	user := &User{Name: "admin"}
	db.NewInsert().Model(user).ModelTableExpr(renamedTable).Exec(ctx)
	user.Name = "root"
	_, err = db.NewUpdate().Model(user).ModelTableExpr(renamedTable).Where("id = ?", user.ID).Exec(ctx)
	if err != nil {
		fmt.Println("Fail to update user ", err.Error())
	}
	readUser := new(User)
	err = db.NewSelect().Model(readUser).ModelTableExpr(renamedTable).Where("id = ?", user.ID).Scan(ctx)
	if err != nil {
		fmt.Println("Fail to select user ", err.Error())
	}
	_, err = db.NewDelete().Model(user).ModelTableExpr(renamedTable).Where("id = ? ", user.ID).Exec(ctx)
	if err != nil {
		fmt.Println("Fail to delete user ", err.Error())
	}
}