2009-03-17

Python и удаленный Microsoft SQL Server 2005

Для работы из Python с удаленным сервером MSSQL 2005 понадобится провести некоторую подготовку на обоих концах этого тандема.

На стороне сервера баз данных делаем так:
Пуск - Все программы - Microsoft SQL Server 2005 - Средства настройки - Настройка контактной зоны SQL Server. Далее внизу ссылка "Настройка контактной зоны для служб и соединений". В левой панели в первой вкладке видим такие параметры, как "Database Engine", а в нем "Служба" (ставим "Тип запуска" = "Авто" и "Состояние службы" = "Запущена") и "Удаленные соединения" (ставим "Локальные и удаленные соединения").
Ниже Database Engine есть параметр "SQL Server Browser" - "Служба" (ставим тип запуска - "Авто" и состояние службы - "Запущена").
При запуске "Среды SQL Server Management Studio Express", в окошке "Соединение с сервером" будет поле "Имя сервера". Оно выглядит как ИМЯ_КОМПЬЮТЕРА\ИМЯ_СЕРВЕРА_БД. Запомним эти данные, они пригодятся.

На стороне нашего компьютера с Ubuntu:
sudo apt-get install python-pymssql
Вот и всё. Теперь краткий пример работы с БД:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Импортируем библиотеку для работы с MSSQL
import pymssql

# Соединение с БД. Если вы не в том-же домене, что и сервер БД, то вместо
# ИМЯ_КОМПЬЮТЕРА впишите его IP.
con = pymssql.connect(host='ИМЯ_КОМПЬЮТЕРА\ИМЯ_СЕРВЕРА_БД', user='ПОЛЬЗОВАТЕЛЬ_БД', password='ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_БД', database='ИМЯ_БД')

# Создаем курсор для работы с соединением
cur = con.cursor()

# Выполняем запрос
cur.execute("SELECT somefield FROM dbo.sometable;")

# Прокручиваем все записи из запроса
for i in cur.fetchall():

   # Данные в БД в кодировке cp1251, поэтому сначала переводим их в юникод
   i=unicode(i[0],'windows-1251')

   # А затем напечатаем их в utf-8 кодировке
   print "%s" % i.encode('utf-8')

# Подтверждаем транзакцию и закрываем соединение
con.commit()
con.close()

По сравнению с тем, как организовать такое соединение из php (через odbc, используя freetds) - просто праздник какой-то!

1 комментарий:

Анонимный комментирует...

Спасибо ! работает :)