LINUX.ORG.RU

pyodbc + unixODBC + FreeTDS + MSSQL + русские буквы


0

1

Доброго времени суток!

Мне дали доступ к хранимке на MSSQL, которую мне нужно переработать в python. Решил использовать связку, указанную в сабже.

# cat /etc/unixODBC/odbcinst.ini

[FreeTDS]
Description=FreeTDS
Driver=/usr/lib/libtdsodbc.so
UsageCount=1

# cat /etc/unixODBC/odbc.ini

[MSSQL]
Driver=FreeTDS
Description=Database
Trace=No
Server=192.168.2.2
Port=1433
Database=database
UID=user
PWD=password
TDS Version=8.0

При запуске

# isql MSSQL user password

Все работает как надо, но при подключении из pyodbc возникли две проблемы:

1. При записи

con = pyodbc.connect("DNS=MSSQL;UID=user;PWD=password")
Вываливается ошибка: pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnectW)')

2. Если же сделать строку вида

con = pyodbc.connect("UID=user;PWD=password;DATABASE=database;DRIVER={FreeTDS};SERVER=192.168.2.2;PORT=1433")
то подключение работает, но во всех не юникодовых строках русские буквы заменяются знаками вопроса. Уже не знаю куда копать. Может кто-то сможет посоветовать?

PS. pymssql не умеет возвращать юникодовые данные.

PPS. Парсить вывод isql не выход.

У меня работало (в 2006-2007 годы). Разве что - в именах баз данных unixODBC не воспринимал кириллицу - ругался.

Скрипты с использованием ODBC из Питоне погибли при переразбивке разделов моего HDD ...
Остался только код на Си - пример использования ODBC.

pacify ★★★★★
()
Ответ на: комментарий от pacify

Я лазил в исходники pyodbc, и заметил, что вопросы появляются уже при выполнении функции SQLGetData, значит проблемы все-таки при подключении. Возможно я смогу подправить исходники, если найду пример корректной работы с ODBC на си. Буду признателен за код.

albertn
() автор топика
22 января 2012 г.

Не знаю актуально ли, на

con = pyodbc.connect("DNS=MSSQL;UID=user;PWD=password")
выдает ошибку ибо очепятка, должно быть не DNS а DSN.

wWolf
()
Ответ на: комментарий от wWolf

Действительно опечатка, но результат работы остался тем-же.

Проблему решил установкой pyodbc-3.0.3 на 3-й питон.

albertn
() автор топика
28 февраля 2012 г.
Ответ на: комментарий от albertn

У меня заработало и даже более или менее с кодировками разобрался.

В odbcinst.ini прописал

[FreeTDS]
Driver          = libtdsodbc.so
Setup           = libtdsS.so
FileUsage       = 1
в odbc.ini собственно DSN
[MSSQL_HOST]
driver          = FreeTDS
server          = 123.45.67.89
port            = 1433
database        = DBNAME
user            = dbguest
tds_version     = 8.0
client_charset  = UTF-8
tds_version - версия драйвера, для mssqls2005 и выше надо 8.0

соединяюсь так

pyodbc.connect('DSN=MSSQL_HOST; UID=dbguest; PWD=mypass')

правда почему то при простой проверке

print cur.execute('select ? ;', u'абвг').fetchone()[0]
возвращает только половину строки :(

wWolf
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.