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())
}
}