sqlalchemy UnicodeDecodeError: кодек «utf8» не может декодировать байт 0xe7 при попытке выбрать все из таблицы msssql 2005 - PullRequest
0 голосов
/ 26 декабря 2011

Я создаю приложение, которое работает с БД другого приложения, используя mssql 2005 (я не могу изменить это или изменить существующее определение таблицы).w сортировка таблицы mssql: "корзина иврита", и приложение показывает идеальный иврит из таблицы, все файлы py кодируются utf-8

обратите внимание!нет проблем с записью ивритских строк юникода в базу данных с помощью mssql.нет проблем с выбором и удалением: DBSession2.query(object).filter(object.LOADED=='Y').delete(), но при выборе из таблицы я получаю очень досадную ошибку:

  File "D:\Python27\learn\agent\agent\lib\encodings\utf_8.py", line 16, in decode     return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe0 in position 0: invalid continuation byte

, когда точный байтовый код изменяется в соответствии с первым байтом первой строки втаблица.

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

кстати -это работало нормально на тестовом сервере mssql 2005, но не работает с рабочим сервером.

некоторый код: это сбойная часть функции:

def iterateJson(parser,injson,object):
    '''iterateJson(parser,injson,object):getting a parser method an a json and iterating over the json
    with the parser method, checkes for existing objects in the db table and deletes them before commiting the new one to
    prevent integerityerrors
    writes ValidateJsonError to errorlog for each element in the json
    getting an onject name to check for loaded etc'''

    #first lets erase the table from loaded objects
    DBSession2.query(object).filter(object.LOADED=='Y').delete()
    print "finished deleting loaded"
    #now lets get a list from the table of loaded id
    raw_list = DBSession2.query(object).all() #the failing part!
    print "getting raw list of unloaded" #doesn't get here!
    if object == Activities:
        id_list = [e.EVENTCODE for e in raw_list]
        id = e.EVENTCODE

это частькласс sqlalchemy:

class Deposit(DeclarativeBase2):
    __tablename__ = 'NOAR_LOADDEPOSIT'
    #LINE = Column(INT(8)) 
    RECDEBNUM = Column(NVARCHAR(9) , primary_key=True)
    CURDATE = Column(BIGINT, nullable=False, default=text(u'((0))')) 
    PAYTYPE = Column(CHAR(1), nullable=False, default=text(u"('')")) 
    BANKCODE = Column(NVARCHAR(8), nullable=False, default=text(u"('')")) 
    CUSTACCNAME = Column(NVARCHAR(16), nullable=False, default=text(u"('')")) 
    PAGENUM = Column(NVARCHAR(5), nullable=False, default=text(u"('')"))
    RECNUM = Column(NVARCHAR(2), nullable=False, default=text(u"('')")) 
    RECDATE = Column(BIGINT, nullable=False, default=text(u'((0))')) 
    FIXNUM = Column(NCHAR(1), nullable=False, default=text(u"('')")) 
    EVENTNUM = Column(NVARCHAR(5), nullable=False, default=text(u"('')")) 
    GROUPCODE = Column(NVARCHAR(7), nullable=False, default=text(u"('')")) 
    IDNUMBER = Column(NVARCHAR(9), nullable=False, default=text(u"('')")) 

и другой класс (оба создают одну и ту же проблему)

class Activities(DeclarativeBase2):  


    __tablename__ = 'NOAR_LOADEVENTS'

    EVENTCODE = Column(NVARCHAR(8), primary_key=True)
    EVENTDES = Column(Unicode, nullable=False, default=text(u"('')"))
    TYPE = Column(NCHAR(1), nullable=False, default=text(u"('')"))
    LC = Column(NCHAR(1), nullable=False, default=text(u"('')"))
    LD = Column(NCHAR(1), nullable=False, default=text(u"('')"))
    LE = Column(NCHAR(1), nullable=False, default=text(u"('')"))
    LF = Column(NCHAR(1), nullable=False, default=text(u"('')"))
    LG = Column(NCHAR(1), nullable=False, default=text(u"('')"))
    LH = Column(NCHAR(1), nullable=False, default=text(u"('')"))

с использованием: python 2.7 (64-битная победа) с pyodbc 2.1.11 vs mssql server 2005, sqlalchemy 0.7.3 tg2.1.3

рад за любую помощь или ссылку

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Исходя из того, что вы говорите, весьма вероятно, что текстовые столбцы в таблице базы данных закодированы в cp1255 (иврит Windows), но ваш код ожидает UTF-8, возможно, по умолчанию явно не сообщается ничего о кодировке.

Вам нужно найти то, что нужно изменить в sqlalchemy или pyodbc, чтобы исправить дезинформацию.

0 голосов
/ 27 декабря 2011

нашел ответ - классическая ВТФ.кажется, что рабочий сервер имел немного другую конфигурацию, чем тестовый сервер (хотя оба должны были быть одинаковыми) - поэтому вместо nvarchar моя модель приложения ожидала, что получит varchar.Спасибо за помощь.написание вопроса все равно помогло мне прояснить мысли

...