[Из песочницы] Работа с базой данных 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.