Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 30, 2013 15:31:58

Dimitor
От:
Зарегистрирован: 2007-10-30
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

pymssql 2.0.0, проблема с кодировками

Добрый день
В одном из моих проектов требуется записывать в MSSQL строки на русском языке. После смены версии библиотеки pymssql на свежую столкнулся с изменением ее поведения, с которым не смог справиться самостоятельно. Покажу на тестовом примере (такая схема работала на старой версии pymssql и вполне устраивала)
(Среда выполнения: Windows, Python 2.7, pymssql 2.0.0b, MSSQL2005, Collation - Cyrillic General CI AS):

# -*- coding: cp1251 -*-
import pymssql
con = pymssql.connect(host='127.1.1.1',user='sa',password='pass', database='reports', charset='cp1251')
cur = con.cursor()
sql = u"insert into users (FirstName,LastName,Job) values ('Вася', 'Пупкин', 'Пользователь')"
print sql, isinstance(sql, unicode) # Исходный запрос
sql = sql.encode('cp1251')
print sql, isinstance(sql, unicode) # Запрос в кодировке БД
cur.execute(sql)
con.commit()
cur.execute('SELECT * FROM users')
for row in cur:
    print row[0], row[1], row[2]
    
con.close()
В результате получаем:
insert into users (FirstName,LastName,Job) values ('Вася', ‘Пупкин’, ‘Пользователь’) True
insert into users (FirstName,LastName,Job) values ('Вася', ‘Пупкин’, ‘Пользователь’) False

49 Павел Иванов # Нормальные значения, внесенные старой версией

55 Aany Ioieei # Значения в неверной кодировке, внесенные новой версией
После некоторой медитации с доками и исходным кодом библиотеки, решил что кодировку БД достаточно указать один раз в начале, а дополнительное преобразование sql = sql.encode('cp1251') уже не нужно и является старым костылем. Но стало только хуже:
insert into users (FirstName,LastName,Job) values ('Вася', ‘Пупкин’, ‘Пользователь’) True
insert into users (FirstName,LastName,Job) values ('Вася', ‘Пупкин’, ‘Пользователь’) True

Traceback (most recent call last):
File “D:\Projects\Губкинский ГПК - НТК2 - Тренажер\tools\chek_mssql.py”, line 26, in <module>
cur.execute(sql) #, params)
File “pymssql.pyx”, line 380, in pymssql.Cursor.execute (pymssql.c:4790)
self._source._conn.execute_query(operation)
File “_mssql.pyx”, line 787, in _mssql.MSSQLConnection.execute_query (_mssql.c:8225)
cpdef execute_query(self, query_string, params=None):
File “_mssql.pyx”, line 818, in _mssql.MSSQLConnection.execute_query (_mssql.c:8107)
self.format_and_run_query(query_string, params)
File “_mssql.pyx”, line 951, in _mssql.MSSQLConnection.format_and_run_query (_mssql.c:9302)
log(query_string)
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 52-55: ordinal not in range(128)
Подскажите, что я делаю не так? Как затолкать в MSSQL простые текстовые данные?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version