sqlalchemy выдает DataError 22001, используя tg2 и pyodbc для записи в SQL Server 2005 - PullRequest
1 голос
/ 28 ноября 2011

Я использую отображенный класс sqlalchemy в таблицу SQL Server.I DBSession.add () экземпляры класса Activity (сопоставленный класс) с данными, полученными из другого источника.и затем я вызвал транзакцию транзитной передачи () (так как я звоню из tg2, я не могу использовать session.commit ())

трассировка ошибок:

DataError: (DataError) ('22001', '[22001] [Microsoft][ODBC SQL Server Driver][SQ
L Server]String or binary data would be truncated. (8152) (SQLExecDirectW); [010
00] [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been termin
ated. (3621)') u'INSERT INTO [NOAR_LOADEVENTS] ([EVENTCODE]) VALUES (?)' ((u'210
401',), (u'210402',), (u'210602',), (u'210603',), (u'000010',), (u'000102',), (u
'000206',), (u'000107',)  ... displaying 10 of 49 total bound parameter sets ...
  (u'211302',), (u'210403',))

радЛюбая помощь по этому поводу, так как я не знаю, как продолжить / отладить это здесь

edit: у меня было подозрение, что это как-то связано с юникодом, поэтому я изменил столбец sqlalchemy на юникод.

возможно, DataError как-то застрял, и мне нужно вызвать откат, но я не знаю, как вызвать откат в транзакции в tg2

edit : столбец EVENTCODE вmssql: datatype: PK, nvarchar (6). Надеюсь, что это поможет

другое редактирование : код вставки (соответствующая часть)

event = #json with data
ac['EVENTCODE']=event.get('code')#for example u'210602' - from the failing data
...
...
e = Activities(**ac) # this is the class mapped with sqlalchemy to the NOAR_LOADEVENTS in sqlalchemy.
DBSession2.add(e)
transaction.commit()

1 Ответ

1 голос
/ 29 ноября 2011

решена.Комментарий @beargle привел меня в правильном направлении.Кажется, проблема достаточно странная - это попытка вставить в поле nvarchar длиной 6. Кажется, что строка Unicode длиной 6, например: u'110110 ', выдаст ошибку, в то время как строка' 110110 'пройдет нормально.поэтому я использую

variable.encode ('utf-8') и все работает.

что угодно.

...