Работа с базой данных 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.

ссылка на оригинал статьи http://habrahabr.ru/post/253365/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *