diff --git a/cmd/subcmd_generate_models.go b/cmd/subcmd_generate_models.go index 858fdbf..b13c4c5 100644 --- a/cmd/subcmd_generate_models.go +++ b/cmd/subcmd_generate_models.go @@ -62,8 +62,9 @@ var generate_model = &cobra.Command{ modelgenerate.GenerateIDType(table), modelgenerate.GenerateModelAST(table), modelgenerate.GenerateSaveItemFunc(table), - modelgenerate.GenerateGetItemByIDFunc(table), modelgenerate.GenerateDeleteItemFunc(table), + modelgenerate.GenerateSQLFieldsConst(table), + modelgenerate.GenerateGetItemByIDFunc(table), }, } diff --git a/pkg/codegen/modelgenerate/generate_model.go b/pkg/codegen/modelgenerate/generate_model.go index 84bdd82..4ec590f 100644 --- a/pkg/codegen/modelgenerate/generate_model.go +++ b/pkg/codegen/modelgenerate/generate_model.go @@ -173,18 +173,23 @@ func GenerateGetItemByIDFunc(tbl schema.Table) *ast.FuncDecl { arg := &ast.FieldList{List: []*ast.Field{{Names: []*ast.Ident{ast.NewIdent("id")}, Type: ast.NewIdent(tbl.TypeIDName)}}} result := &ast.FieldList{List: []*ast.Field{{Names: []*ast.Ident{ast.NewIdent("ret")}, Type: ast.NewIdent(tbl.TypeName)}, {Names: []*ast.Ident{ast.NewIdent("err")}, Type: ast.NewIdent("error")}}} - selectCols := make([]string, 0, len(tbl.Columns)) - for _, col := range tbl.Columns { - selectCols = append(selectCols, col.Name) + // Use the xyzSQLFields constant in the select query + selectExpr := &ast.BinaryExpr{ + X: &ast.BinaryExpr{ + X: &ast.BasicLit{Kind: token.STRING, Value: "`\n\t select `"}, + Op: token.ADD, + Y: SQLFieldsConstIdent(tbl), + }, + Op: token.ADD, + Y: &ast.BasicLit{Kind: token.STRING, Value: "`\n\t from " + tbl.TableName + "\n\t where rowid = ?\n\t`"}, } - selectStmt := fmt.Sprintf("\n\t select %s\n\t from %s\n\t where rowid = ?\n\t", strings.Join(selectCols, ", "), tbl.TableName) funcBody := &ast.BlockStmt{ List: []ast.Stmt{ &ast.AssignStmt{ Lhs: []ast.Expr{ast.NewIdent("err")}, Tok: token.ASSIGN, - Rhs: []ast.Expr{&ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("db.DB"), Sel: ast.NewIdent("Get")}, Args: []ast.Expr{&ast.UnaryExpr{Op: token.AND, X: ast.NewIdent("ret")}, &ast.BasicLit{Kind: token.STRING, Value: "`" + selectStmt + "`"}, ast.NewIdent("id")}}}, + Rhs: []ast.Expr{&ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("db.DB"), Sel: ast.NewIdent("Get")}, Args: []ast.Expr{&ast.UnaryExpr{Op: token.AND, X: ast.NewIdent("ret")}, selectExpr, ast.NewIdent("id")}}}, }, &ast.IfStmt{ Cond: &ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("errors"), Sel: ast.NewIdent("Is")}, Args: []ast.Expr{ast.NewIdent("err"), &ast.SelectorExpr{X: ast.NewIdent("sql"), Sel: ast.NewIdent("ErrNoRows")}}}, @@ -239,3 +244,31 @@ func GenerateDeleteItemFunc(tbl schema.Table) *ast.FuncDecl { } return funcDecl } + +// GenerateSQLFieldsConst produces an AST for the `const xyzSQLFields = ...` string. +func GenerateSQLFieldsConst(tbl schema.Table) *ast.GenDecl { + columns := make([]string, 0, len(tbl.Columns)) + for _, col := range tbl.Columns { + columns = append(columns, col.Name) + } + // Join with comma and space + value := "`" + strings.Join(columns, ", ") + "`" + + return &ast.GenDecl{ + Tok: token.CONST, + Specs: []ast.Spec{ + &ast.ValueSpec{ + Names: []*ast.Ident{SQLFieldsConstIdent(tbl)}, + Values: []ast.Expr{&ast.BasicLit{Kind: token.STRING, Value: value}}, + }, + }, + } +} + +// --------------- +// Helpers +// --------------- + +func SQLFieldsConstIdent(tbl schema.Table) *ast.Ident { + return ast.NewIdent(strings.ToLower(tbl.TypeName) + "SQLFields") +}