Я создаю приложение, которое работает с БД другого приложения, используя 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
рад за любую помощь или ссылку