Pull to refresh

Работа с базой данных MS SQL средствами Go для начинающих

Reading time 3 min
Views 30K
В данный момент язык 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.

Поэтому, если вы запустите нашу программу, то увидите белеберду в консоли вместо русских букв. Чтобы это избежать, давайте воспользуемся пакетами golang.org/x/text/encoding/charmap, golang.org/x/text/transform

Полная программа с перекодировкой из cp1251 в UTF8
package main

import (
	"database/sql"
	"fmt"
	"io/ioutil"
	"log"
	"strings"
	"golang.org/x/text/encoding/charmap"
	"golang.org/x/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 != nil {
			log.Fatal(err)
		}
		name_utf = string(buf)
		fmt.Println(name_utf)
	}
	defer rows.Close()
}


Конечный результат:



Видим и радуемся, что все читается и данные из базы вытаскиваются. Хочу заметить, если в запросе на выходе будут два или больше столбцов, например, фамилия, имя и отчество, то не забываем их указывать в rows.Scan именно в том порядке, что и в SQL запросе.

Чему мы научились после прочтения этой статьи? Получили базовые знания для работы с базами данными. Дальше можно будет их обрабатывать, сортировать или выводить в браузере и т.д. и т.п. Статья не рассчитана на опытных программистов и написана специально для людей, которые только начинают изучать довольно интересный язык Go.
Tags:
Hubs:
+7
Comments 16
Comments Comments 16

Articles