В данный момент язык Go становится все популярнее и популярнее с каждым днем. На Хабре все чаще появляются статьи на тему, которые интересно читать не только прожженным спецам-програмистам, но и системным администраторам.
Я работаю системным администратором и проявляю интерес к Go, так как нам часто приходится писать скрипты на bash (shell) для автоматизации своих действий и увеличения времени на поедание печенек и заливания кофе в наш щупленький организм.
Хотелось бы поделиться небольшим опытом о том, как не программист писал небольшую программу на Go.
Приступим.
В компании, в которой я работаю есть некая программа, которая используется всеми. В ее основе лежит база на сервере MS SQL 2008. В прекрасный момент (для меня не очень) шеф заявляет, что надо написать программу, в которой нужные люди будут смотреть определенный данные из той самой базы.
Для работы с базами данных есть пакеты database/sql и code.google.com/p/odbc. Их и будем использовать. Так же не забываем, что надо установить ODBC драйвер, через который и будем работать с MS SQL. Для Windows это делается через Odbcad32.exe путем добавления клиентского DSN. Для Linux немного сложнее, но это не входит в рамки статьи. Думаю, Google вам поможет.
Вот таким у нас получается список пакетов, которым будем пользоваться на первом этапе.
import (
"database/sql"
"fmt"
"log"
_ "code.google.com/p/odbc"
)
Пробуем соединиться с базой и выполнить запрос, дабы достать нужные нам данные.
package main
import (
_ "code.google.com/p/odbc"
"database/sql"
"fmt"
"log"
)
var (
name_otdel string
query string
)
func main() {
db, err := sql.Open("odbc", "DSN=DBS0")
if err != nil {
fmt.Println("Error in connect DB")
log.Fatal(err)
}
query = "select t.DepartmentNAME from dbo.oms_Department t where t.rf_LPUID = 1078"
rows, err := db.Query(query)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
if err := rows.Scan(&name_otdel); err != nil {
log.Fatal(err)
}
fmt.Println(name_otdel)
}
defer rows.Close()
}
Как видно из программы, все не так сложно и даже такие люди, как я (мало понимаем в программировании), могут постепенно учиться писать на Go.
Правда, есть один нюанс. При разворачивании сервера баз данных MS SQL Server обычно не трогают настройки кодировок и она в большей части мест стоит windows1251. Это доставляет некое неудобство, так как в Go все работает в UTF8. В связи с этим мы будем применять дополнительные пакеты, не входящие в состав Go, для перекодировки windows1251 в UTF8.
Поэтому, если вы запустите нашу программу, то увидите белеберду в консоли вместо русских букв. Чтобы это избежать, давайте воспользуемся сторонними пакетами code.google.com/p/go.text/encoding/charmap, code.google.com/p/go.text/transform
package main
import (
"database/sql"
"fmt"
"io/ioutil"
"log"
"strings"
"code.google.com/p/go.text/encoding/charmap"
"code.google.com/p/go.text/transform"
_ "code.google.com/p/odbc"
)
var (
name_otdel string
name_utf string
query string
)
func main() {
db, err := sql.Open("odbc", "DSN=DBS0")
if err != nil {
fmt.Println("Error in connect DB")
log.Fatal(err)
}
query = "select t.DepartmentNAME from dbo.oms_Department t where t.rf_LPUID = 1078"
rows, err := db.Query(query)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
if err := rows.Scan(&name_otdel); err != nil {
log.Fatal(err)
}
sr := strings.NewReader(name_otdel)
tr := transform.NewReader(sr, charmap.Windows1251.NewDecoder())
buf, err := ioutil.ReadAll(tr)
if err != err {
log.Fatal(err)
}
name_utf = string(buf)
fmt.Println(name_utf)
}
defer rows.Close()
}
Конечный результат:
Видим и радуемся, что все читается и данные из базы вытаскиваются. Хочу заметить, если в запросе на выходе будут два или больше столбцов, например, фамилия, имя и отчество, то не забываем их указывать в rows.Scan именно в том порядке, что и в SQL запросе.
Чему мы научились после прочтения этой статьи? Получили базовые знания для работы с базами данными. Дальше можно будет их обрабатывать, сортировать или выводить в браузере и т.д. и т.п. Статья не рассчитана на опытных программистов и написана специально для людей, которые только начинают изучать довольно интересный язык Go.
Автор: xlin