I am trying to write a procedure that will prepare and exec/query one line:

 package postregsql import ( "database/sql" "errors" _ "github.com/lib/pq" ) func Query(database *sql.DB, sql string, args ...interface{}) (*sql.Rows, error) { db_stmt, err := database.Prepare(sql) if err != nil { return nil, errors.New("Ошибка Query(" + sql + ")<DB_Prepare>: " + err.Error()) } defer db_stmt.Close() db_rows, err := db_stmt.Query(args...) if err != nil { return nil, errors.New("Ошибка Query(" + sql + ")<DB_Query>: " + err.Error()) } defer db_rows.Close() return db_rows, nil } func Exec(database *sql.DB, sql string, args ...interface{}) error { db_stmt, err := database.Prepare(sql) if err != nil { return errors.New("Ошибка Exec(" + sql + ")<DB_Prepare>: " + err.Error()) } defer db_stmt.Close() _, err = db_stmt.Exec(args...) if err != nil { return errors.New("Ошибка Exec(" + sql + ")<DB_Exec>: " + err.Error()) } return nil } 

Exec () for INSERT / UPDATE / CREATE

Query () for SELECT

Exec() does its job perfectly, but with Query() problem - any query with arguments gives empty answers, for example:

 name := "1" answer, _ := postregsql.Query(db, "SELECT COUNT(*) FROM table1 WHERE name=$1;", name) count := 0 for answer.Next { answer.Scan(&count) } // count == 0 (по факту больше 1 должно быть) 

I sin on this line *db_rows, err := db_stmt.Query(args...)* - how to fix it so that it works correctly?

    1 answer 1

    defer db_rows.Close () is executed before you start processing the results of answer.Next, answer.Scan (), right after leaving the Query () function.

    The meaning of this function is not clear, there is database.Query ().

    • reduce the number of lines so as not to constantly call first prepare, then query. - Vitaly Pozdnyakov
    • So without db.Prepare () and then stmt.Query () you can call db.Query () right away. - Volka
    • It seems to me that db.Prepare () prepares a safe / shielded injection request. if I'm wrong, then correct me, please - Vitaly Pozdnyakov
    • Requests prepare in the same way, that in db.Prepare (), that in db.Query (). - Volka