Как объявить строку SQL, если еще оператор не объявил проблему - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть код, подобный приведенному ниже.

var sql string

if pnt.Type == "newType" {
    sql = `select code, count(*) count from ( 
                select code 
                    from code_table 
                    where start >= ? and end <= ? 
                union 
                select code 
                    from code_table 
                    where start >= ? and end <= ? 
                ) a group by code`
    rows, err := pnt.readConn("testdb").Query(sql, start, end, start, end)
} else {
    sql = `select code, count(*) count from code_table where start >= ? and end <= ?` group by code
    rows, err := pnt.readConn("testdb").Query(sql, start, end)
}

if err == nil {
    defer rows.Close()
    for rows.Next() {
        var code, count int
        rows.Scan(&code, &count)
    }
} else {
    log.Println(err)
}

Это выдаст мне сообщение об ошибке типа "Переменная не объявлена ​​для строк, ошибаться" ...

У меня естьпопытался объявить «ошибка var err», и в операторе if else я использую = вместо: = что-то вроде этого

var err error
rows, err = pnt.switchConn("base", "read").Query(sql, start, end)

Однако я все еще не могу объявить строки, потому что у меня будет другой видошибки для этого.Я попытался объявить его как строку, но не повезло.

Я впервые использую golang, и если что-то другое доставляет мне неприятности, почему я не могу просто использовать: = внутри оператора if else.Как видите, я не могу использовать строки, err: = вне оператора if else, потому что у обоих разное количество параметров.

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Вы столкнулись с проблемами из-за области действия переменной.В Golang := создает новую переменную внутри области.

rows, err := pnt.ReadConn("testdb").Query(sql, start, end, start, end)

Создает новые rows и err переменные в блоке if, которые не будутбыть доступным вне блока if.

Сокращенные объявления в Go

Исправление,

var sql string
var err error
var rows *sql.Rows

if pnt.Type == "newType" {
    sql = `select code, count(*) count from ( 
                select code 
                    from code_table 
                    where start >= ? and end <= ? 
                union 
                select code 
                    from code_table 
                    where start >= ? and end <= ? 
                ) a group by code`
    rows, err = pnt.ReadConn("testdb").Query(sql, start, end, start, end)
} else {
    sql = `select code, count(*) count from code_table where start >= ? and end <= ?` group by code
    rows, err = pnt.ReadConn("testdb").Query(sql, start, end)
}

if err == nil {
    defer rows.Close()
    for rows.Next() {
        var code, count int
        rows.Scan(&code, &count)
    }
} else {
    log.Println(err)
}
0 голосов
/ 28 сентября 2019

В golang ": =" означает, что вы объявляете переменную и присваиваете им это значение. GO автоматически определяет его тип так: Примеры variable := 15 Это то же самое var variable int = 15

Так что, когда вы делаете это rows, err := pnt.switchConn("base", "read").Query(sql, start, end, start, end) } else { sql = выбрать код, считать (*) считать из code_table где начало> =?и конец <=? <code>group by code rows, err := pnt.switchConn("base", "read").Query(sql, start, end) } Вы объявляете одни и те же строки переменных и ошибаетесь дважды

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...