[Из песочницы] Работа с базой данных MS SQL средствами Go для начинающих
В данный момент язык 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
Полная программа с перекодировкой из cp1251 в UTF8 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.
